#BAEL-1025 (#2445)
This commit is contained in:
parent
706b3d6c67
commit
802c0b09e0
|
@ -40,16 +40,38 @@
|
||||||
<artifactId>ratpack-hikari</artifactId>
|
<artifactId>ratpack-hikari</artifactId>
|
||||||
<version>${ratpack.version}</version>
|
<version>${ratpack.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.ratpack</groupId>
|
||||||
|
<artifactId>ratpack-hystrix</artifactId>
|
||||||
|
<version>${ratpack.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.ratpack</groupId>
|
||||||
|
<artifactId>ratpack-rx</artifactId>
|
||||||
|
<version>${ratpack.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.ratpack</groupId>
|
<groupId>io.ratpack</groupId>
|
||||||
<artifactId>ratpack-test</artifactId>
|
<artifactId>ratpack-test</artifactId>
|
||||||
<version>${ratpack.version}</version>
|
<version>${ratpack.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<version>1.4.193</version>
|
<version>1.4.193</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpcore</artifactId>
|
||||||
|
<version>4.4.6</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommand;
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
|
import org.apache.http.message.BasicHeader;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixAsyncHttpCommand extends HystrixCommand<String> {
|
||||||
|
|
||||||
|
private URI uri;
|
||||||
|
private RequestConfig requestConfig;
|
||||||
|
|
||||||
|
HystrixAsyncHttpCommand(URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-async"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
requestConfig = RequestConfig
|
||||||
|
.custom()
|
||||||
|
.setSocketTimeout(timeoutMillis)
|
||||||
|
.setConnectTimeout(timeoutMillis)
|
||||||
|
.setConnectionRequestTimeout(timeoutMillis)
|
||||||
|
.build();
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String run() throws Exception {
|
||||||
|
return EntityUtils.toString(HttpClientBuilder
|
||||||
|
.create()
|
||||||
|
.setDefaultRequestConfig(requestConfig)
|
||||||
|
.setDefaultHeaders(Collections.singleton(new BasicHeader("User-Agent", "Baeldung Blocking HttpClient")))
|
||||||
|
.build()
|
||||||
|
.execute(new HttpGet(uri))
|
||||||
|
.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getFallback() {
|
||||||
|
return "eugenp's async fallback profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import com.netflix.hystrix.HystrixObservableCommand;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.rx.RxRatpack;
|
||||||
|
import rx.Observable;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixReactiveHttpCommand extends HystrixObservableCommand<String> {
|
||||||
|
|
||||||
|
private HttpClient httpClient;
|
||||||
|
private URI uri;
|
||||||
|
|
||||||
|
HystrixReactiveHttpCommand(HttpClient httpClient, URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-reactive"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
this.httpClient = httpClient;
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Observable<String> construct() {
|
||||||
|
return RxRatpack.observe(httpClient
|
||||||
|
.get(uri, requestSpec -> requestSpec.headers(mutableHeaders -> mutableHeaders.add("User-Agent", "Baeldung HttpClient")))
|
||||||
|
.map(receivedResponse -> receivedResponse
|
||||||
|
.getBody()
|
||||||
|
.getText()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Observable<String> resumeWithFallback() {
|
||||||
|
return Observable.just("eugenp's reactive fallback profile");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommand;
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
|
import org.apache.http.message.BasicHeader;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixSyncHttpCommand extends HystrixCommand<String> {
|
||||||
|
|
||||||
|
private URI uri;
|
||||||
|
private RequestConfig requestConfig;
|
||||||
|
|
||||||
|
HystrixSyncHttpCommand(URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-sync"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
requestConfig = RequestConfig
|
||||||
|
.custom()
|
||||||
|
.setSocketTimeout(timeoutMillis)
|
||||||
|
.setConnectTimeout(timeoutMillis)
|
||||||
|
.setConnectionRequestTimeout(timeoutMillis)
|
||||||
|
.build();
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String run() throws Exception {
|
||||||
|
HttpGet request = new HttpGet(uri);
|
||||||
|
return EntityUtils.toString(HttpClientBuilder
|
||||||
|
.create()
|
||||||
|
.setDefaultRequestConfig(requestConfig)
|
||||||
|
.setDefaultHeaders(Collections.singleton(new BasicHeader("User-Agent", "Baeldung Blocking HttpClient")))
|
||||||
|
.build()
|
||||||
|
.execute(request)
|
||||||
|
.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getFallback() {
|
||||||
|
return "eugenp's sync fallback profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import ratpack.guice.Guice;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.hystrix.HystrixMetricsEventStreamHandler;
|
||||||
|
import ratpack.hystrix.HystrixModule;
|
||||||
|
import ratpack.server.RatpackServer;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
public class RatpackHystrixApp {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
final int timeout = Integer.valueOf(System.getProperty("ratpack.hystrix.timeout"));
|
||||||
|
final URI eugenGithubProfileUri = new URI("https://api.github.com/users/eugenp");
|
||||||
|
|
||||||
|
RatpackServer.start(server -> server
|
||||||
|
.registry(Guice.registry(bindingsSpec -> bindingsSpec.module(new HystrixModule().sse())))
|
||||||
|
.handlers(chain -> chain
|
||||||
|
.get("rx", ctx -> new HystrixReactiveHttpCommand(ctx.get(HttpClient.class), eugenGithubProfileUri, timeout)
|
||||||
|
.toObservable()
|
||||||
|
.subscribe(ctx::render))
|
||||||
|
.get("async", ctx -> ctx.render(new HystrixAsyncHttpCommand(eugenGithubProfileUri, timeout)
|
||||||
|
.queue()
|
||||||
|
.get()))
|
||||||
|
.get("sync", ctx -> ctx.render(new HystrixSyncHttpCommand(eugenGithubProfileUri, timeout).execute()))
|
||||||
|
.get("hystrix", new HystrixMetricsEventStreamHandler())));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import ratpack.test.MainClassApplicationUnderTest;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class RatpackHystrixAppFallbackLiveTest {
|
||||||
|
|
||||||
|
static MainClassApplicationUnderTest appUnderTest;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() {
|
||||||
|
System.setProperty("ratpack.hystrix.timeout", "10");
|
||||||
|
appUnderTest = new MainClassApplicationUnderTest(RatpackHystrixApp.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchReactive_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("rx"), containsString("reactive fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchAsync_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("async"), containsString("async fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchSync_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("sync"), containsString("sync fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void clean() {
|
||||||
|
appUnderTest.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import ratpack.test.MainClassApplicationUnderTest;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class RatpackHystrixAppLiveTest {
|
||||||
|
|
||||||
|
static MainClassApplicationUnderTest appUnderTest;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() {
|
||||||
|
System.setProperty("ratpack.hystrix.timeout", "5000");
|
||||||
|
appUnderTest = new MainClassApplicationUnderTest(RatpackHystrixApp.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchReactive_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("rx"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchAsync_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("async"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchSync_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("sync"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void clean() {
|
||||||
|
appUnderTest.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue