public class TestServiceCallHystrixCommand {
private static final int PORT = 3080;
@ClassRule
public static WireMockClassRule wireMockRule = new WireMockClassRule(PORT);
@Rule
public WireMockClassRule service1 = wireMockRule;
@Before
public void setUp() throws Exception {
service1.stubFor(get(urlEqualTo("/unit-test-1")).atPriority(10).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/unit-test-2")).atPriority(10).willReturn(aResponse().withStatus(404)));
service1.stubFor(get(urlEqualTo("/unit-test-3")).atPriority(10).willReturn(aResponse().withStatus(500)));
service1.stubFor(get(urlPathEqualTo("/unit-test-4")).withQueryParam("param1", equalTo("value1")).atPriority(10).willReturn(aResponse().withStatus(200)));
service1.stubFor(put(urlEqualTo("/put-test-1")).atPriority(10).willReturn(aResponse().withStatus(200)));
service1.stubFor(patch(urlEqualTo("/patch-test-1")).atPriority(10).willReturn(aResponse().withStatus(200)));
service1.stubFor(delete(urlEqualTo("/delete-test-1")).atPriority(10).willReturn(aResponse().withStatus(200)));
service1.stubFor(post(urlEqualTo("/post-test-1")).atPriority(10).willReturn(aResponse().withStatus(201)));
service1.stubFor(get(urlEqualTo("/header-test-1")).withHeader("X-UnitTest-Header", equalTo("12345")).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/header-test-2")).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/generate-correlation-id")).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/propagate-correlation-id")).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/override-correlation-id")).willReturn(aResponse().withStatus(200)));
service1.stubFor(get(urlEqualTo("/exception-test-1")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE)));
}
@Test
public void testWithRequestBodyViaServiceCallHystrixCommand() throws Exception {
service1.resetAll();
service1.stubFor(post(urlEqualTo("/request-body-test-1")).withRequestBody(matching("<status>OK</status>")).willReturn(aResponse().withStatus(201)));
PrismRequest request = PrismRequest.builder()
.namespaceUri("com.mycompany.test")
.serviceName("UnitTest")
.requestMethod(Method.POST)
.uri("/request-body-test-1")
.entity("<status>OK</status>")
.build();
ServiceCallHystrixCommand command = new ServiceCallHystrixCommand("http", "localhost", PORT, request);
PrismResponse response = command.execute();
assertEquals(201, response.getResponseCode());
}
@Test
public void testPostCallViaServiceCallHystrixCommand() {
PrismRequest request = PrismRequest.builder()
.namespaceUri("com.mastercard.test")
.serviceName("UnitTest")
.requestMethod(Method.POST)
.uri("/post-test-1")
.build();
ServiceCallHystrixCommand command = new ServiceCallHystrixCommand("http", "localhost", PORT, request);
PrismResponse response = command.execute();
assertEquals(201, response.getResponseCode());
}
// 12 more test methods here...
}
But when the same code is run by Bamboo, the first test listed above 'testPostCallViaServiceCallHystrixCommand' always fails. It seems to be failing due to a timeout. See the Bamboo output below:
build 14-Dec-2016 14:12:33 INFO : / - RequestHandlerClass from context returned com.github.tomakehurst.wiremock.http.StubRequestHandler. Normalized mapped under returned 'null'build 14-Dec-2016 14:13:39 INFO : org.eclipse.jetty.server.ServerConnector - Stopped ServerConnector@3c57f3e9{HTTP/1.1}{0.0.0.0:3080}build 14-Dec-2016 14:13:39 INFO : org.eclipse.jetty.server.handler.ContextHandler - Stopped o.e.j.s.ServletContextHandler@7c447c76{/,null,UNAVAILABLE}build 14-Dec-2016 14:13:39 INFO : org.eclipse.jetty.server.handler.ContextHandler - Stopped o.e.j.s.ServletContextHandler@118102ee{/__admin,null,UNAVAILABLE}build 14-Dec-2016 14:13:39 WARN : org.eclipse.jetty.util.thread.QueuedThreadPool - qtp896852376{STOPPING,8<=8<=30,i=2,q=2} Couldn't stop Thread[qtp896852376-12,5,]build 14-Dec-2016 14:13:39 WARN : org.eclipse.jetty.util.thread.QueuedThreadPool - qtp896852376{STOPPING,8<=8<=30,i=0,q=1} Couldn't stop Thread[qtp896852376-13,5,]build 14-Dec-2016 14:13:39 Tests run: 14, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 77.364 sec <<< FAILURE! - in com.mycompany.apie.synapse.prism.hystrix.TestServiceCallHystrixCommandbuild 14-Dec-2016 14:13:39 testPostCallViaServiceCallHystrixCommand(com.mycompany.apie.synapse.prism.hystrix.TestServiceCallHystrixCommand) Time elapsed: 7.069 sec <<< ERROR!build 14-Dec-2016 14:13:39 com.netflix.hystrix.exception.HystrixRuntimeException: localhost:3080 timed-out and no fallback available.build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:806)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$16.call(AbstractCommand.java:790)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:139)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1521)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1411)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:314)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:306)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:162)build 14-Dec-2016 14:13:39 at rx.Observable$2.call(Observable.java:154)build 14-Dec-2016 14:13:39 at rx.Observable.unsafeSubscribe(Observable.java:8314)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:141)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:958)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37)build 14-Dec-2016 14:13:39 at com.github.kristofa.brave.BraveCallable.call(BraveCallable.java:42)build 14-Dec-2016 14:13:39 at com.mycompany.apie.synapse.prism.hystrix.TraceContextCallable.call(TraceContextCallable.java:39)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:978)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:100)build 14-Dec-2016 14:13:39 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)build 14-Dec-2016 14:13:39 at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)build 14-Dec-2016 14:13:39 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)build 14-Dec-2016 14:13:39 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)build 14-Dec-2016 14:13:39 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)build 14-Dec-2016 14:13:39 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)build 14-Dec-2016 14:13:39 at java.lang.Thread.run(Thread.java:745)build 14-Dec-2016 14:13:39 Caused by: java.util.concurrent.TimeoutException: nullbuild 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:601)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$9.call(AbstractCommand.java:581)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:139)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:958)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37)build 14-Dec-2016 14:13:39 at com.github.kristofa.brave.BraveCallable.call(BraveCallable.java:42)build 14-Dec-2016 14:13:39 at com.mycompany.apie.synapse.prism.hystrix.TraceContextCallable.call(TraceContextCallable.java:39)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:978)build 14-Dec-2016 14:13:39 at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:100)build 14-Dec-2016 14:13:39 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)build 14-Dec-2016 14:13:39 at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)build 14-Dec-2016 14:13:39 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)build 14-Dec-2016 14:13:39 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)build 14-Dec-2016 14:13:39 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)build 14-Dec-2016 14:13:39 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)build 14-Dec-2016 14:13:39 at java.lang.Thread.run(Thread.java:745)build 14-Dec-2016 14:13:39 build 14-Dec-2016 14:13:41 Running com.mycompany.apie.synapse.prism.hystrix.TraceContextCallableTestbuild 14-Dec-2016 14:13:41 Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.14 sec - in com.mycompany.apie.synapse.prism.hystrix.TraceContextCallableTestThis only seems to affect the first test run and the rest of the tests execute and pass perfectly fine. Also, it only happens on Bamboo and I can't reproduce this locally. Anyone got any ideas?