diff --git a/CHANGES.md b/CHANGES.md index 731f74226a..7d9f030558 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Release Notes. * Update Maven to 3.6.3 in mvnw. * Fix OOM due to too many span logs. * Fix ClassLoader cache OOM issue with WeakHashMap. +* Fix Jetty client cannot receive the HTTP response body. All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1) diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java index 669b43ffda..2858afce44 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java @@ -58,8 +58,13 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr span.prepareForAsync(); request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span); - Response.CompleteListener callback = (Response.CompleteListener) allArguments[0]; - allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture()); + if (allArguments[0] instanceof Response.Listener) { + Response.Listener listener = (Response.Listener) allArguments[0]; + allArguments[0] = new ResponseListenerWrapper(listener, ContextManager.capture()); + } else { + Response.CompleteListener listener = (Response.CompleteListener) allArguments[0]; + allArguments[0] = new CompleteListenerWrapper(listener, ContextManager.capture()); + } } @Override diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java index 0318bd4c00..294b32fe7d 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java @@ -27,11 +27,11 @@ import org.eclipse.jetty.client.api.Result; public class CompleteListenerWrapper implements Response.CompleteListener { - private Response.CompleteListener callback; + private Response.CompleteListener listener; private ContextSnapshot context; - public CompleteListenerWrapper(Response.CompleteListener callback, ContextSnapshot context) { - this.callback = callback; + public CompleteListenerWrapper(Response.CompleteListener listener, ContextSnapshot context) { + this.listener = listener; this.context = context; } @@ -43,9 +43,9 @@ public void onComplete(Result result) { if (context != null) { ContextManager.continued(context); } - if (callback != null) { - callback.onComplete(result); + if (listener != null) { + listener.onComplete(result); } ContextManager.stopSpan(); } -} +} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java new file mode 100644 index 0000000000..cf3e097dda --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.jetty.v90.client; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; +import org.eclipse.jetty.http.HttpField; +import java.nio.ByteBuffer; + +public class ResponseListenerWrapper implements Response.Listener { + + private final Response.Listener listener; + + private final ContextSnapshot context; + + public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot context) { + this.listener = listener; + this.context = context; + } + + @Override + public void onComplete(Result result) { + AbstractSpan span = ContextManager.createLocalSpan(Constants.PLUGIN_NAME + "/CompleteListener/onComplete"); + span.setComponent(ComponentsDefine.JETTY_CLIENT); + SpanLayer.asHttp(span); + if (context != null) { + ContextManager.continued(context); + } + if (listener != null) { + listener.onComplete(result); + } + ContextManager.stopSpan(); + } + + @Override + public void onHeaders(Response response) { + listener.onHeaders(response); + } + + @Override + public void onContent(Response response, ByteBuffer content) { + listener.onContent(response, content); + } + + @Override + public void onBegin(Response response) { + listener.onBegin(response); + } + + @Override + public boolean onHeader(Response response, HttpField field) { + return listener.onHeader(response, field); + } + + @Override + public void onSuccess(Response response) { + listener.onSuccess(response); + } + + @Override + public void onFailure(Response response, Throwable failure) { + listener.onFailure(response, failure); + } +} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java index ef8daf105a..2bee7ecdc1 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java @@ -41,7 +41,7 @@ public class HttpRequestInstrumentation extends ClassInstanceMethodsEnhancePlugi private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.HttpRequest"; private static final String ENHANCE_CLASS_NAME = "send"; public static final String SYNC_SEND_INTERCEPTOR = - "org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendV90Interceptor"; + "org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendInterceptor"; public static final String ASYNC_SEND_INTERCEPTOR = "org.apache.skywalking.apm.plugin.jetty.v90.client.AsyncHttpRequestSendInterceptor"; @@ -85,7 +85,7 @@ public String getMethodsInterceptor() { @Override public boolean isOverrideArgs() { - return false; + return true; } } }; diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java index c4f39c4147..5502c8dc78 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java @@ -41,10 +41,10 @@ */ public class ResponseNotifierInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.tar"; + private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.ResponseNotifier"; private static final String ENHANCE_CLASS_NAME = "notifyComplete"; public static final String SYNC_SEND_INTERCEPTOR = - "org.apache.skywalking.apm.plugin.jetty.v9.client.ResponseNotifierInterceptor"; + "org.apache.skywalking.apm.plugin.jetty.v90.client.ResponseNotifierInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml index 6b92929f8b..229c401f21 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml @@ -31,7 +31,7 @@ http://maven.apache.org - 9.1.0.v20131115 + 9.2.23.v20171218 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java index 6f8870af49..6f39452e0c 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java @@ -57,8 +57,13 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr span.prepareForAsync(); request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span); - Response.CompleteListener callback = (Response.CompleteListener) allArguments[0]; - allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture()); + if (allArguments[0] instanceof Response.Listener) { + Response.Listener listener = (Response.Listener) allArguments[0]; + allArguments[0] = new ResponseListenerWrapper(listener, ContextManager.capture()); + } else { + Response.CompleteListener listener = (Response.CompleteListener) allArguments[0]; + allArguments[0] = new CompleteListenerWrapper(listener, ContextManager.capture()); + } } @Override diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java index 50697bf3e4..156e636884 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java @@ -27,11 +27,11 @@ import org.eclipse.jetty.client.api.Result; public class CompleteListenerWrapper implements Response.CompleteListener { - private Response.CompleteListener callback; + private Response.CompleteListener listener; private ContextSnapshot context; - public CompleteListenerWrapper(Response.CompleteListener callback, ContextSnapshot context) { - this.callback = callback; + public CompleteListenerWrapper(Response.CompleteListener listener, ContextSnapshot context) { + this.listener = listener; this.context = context; } @@ -43,9 +43,9 @@ public void onComplete(Result result) { if (context != null) { ContextManager.continued(context); } - if (callback != null) { - callback.onComplete(result); + if (listener != null) { + listener.onComplete(result); } ContextManager.stopSpan(); } -} +} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java new file mode 100644 index 0000000000..09102cdc43 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.jetty.v9.client; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.util.Callback; + +import java.nio.ByteBuffer; + +public class ResponseListenerWrapper implements Response.Listener { + + private final Response.Listener listener; + + private final ContextSnapshot context; + + public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot context) { + this.listener = listener; + this.context = context; + } + + @Override + public void onComplete(Result result) { + AbstractSpan span = ContextManager.createLocalSpan(Constants.PLUGIN_NAME + "/CompleteListener/onComplete"); + span.setComponent(ComponentsDefine.JETTY_CLIENT); + SpanLayer.asHttp(span); + if (context != null) { + ContextManager.continued(context); + } + if (listener != null) { + listener.onComplete(result); + } + ContextManager.stopSpan(); + } + + @Override + public void onHeaders(Response response) { + listener.onHeaders(response); + } + + @Override + public void onContent(Response response, ByteBuffer content, Callback callback) { + listener.onContent(response, content, callback); + } + + @Override + public void onContent(Response response, ByteBuffer content) { + listener.onContent(response, content); + } + + @Override + public void onBegin(Response response) { + listener.onBegin(response); + } + + @Override + public boolean onHeader(Response response, HttpField field) { + return listener.onHeader(response, field); + } + + @Override + public void onSuccess(Response response) { + listener.onSuccess(response); + } + + @Override + public void onFailure(Response response, Throwable failure) { + listener.onFailure(response, failure); + } +} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java index ae3dc47db1..fb044435da 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java @@ -33,6 +33,7 @@ import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.HttpConversation; import org.eclipse.jetty.client.HttpRequest; import org.eclipse.jetty.client.ResponseNotifier; import org.eclipse.jetty.client.api.Response; @@ -82,8 +83,8 @@ public class AsyncHttpRequestSendInterceptorTest { @Before public void setUp() throws Exception { - httpRequestEnhancedInstance = new MockHttpRequest(httpClient, uri); - responseNotifierEnhancedInstance = new MockResponseNotifier(httpClient); + httpRequestEnhancedInstance = new MockHttpRequest(httpClient, new HttpConversation(), uri); + responseNotifierEnhancedInstance = new MockResponseNotifier(); Result results = new Result(httpRequestEnhancedInstance, response); allArguments = new Object[]{(Response.CompleteListener) result -> { }, results}; @@ -146,8 +147,8 @@ private void assertJettySpan() { } private class MockHttpRequest extends HttpRequest implements EnhancedInstance { - public MockHttpRequest(HttpClient httpClient, URI uri) { - super(httpClient, uri); + public MockHttpRequest(HttpClient client, HttpConversation conversation, URI uri) { + super(httpClient, conversation, uri); } @Override @@ -172,8 +173,8 @@ public void setSkyWalkingDynamicField(Object value) { } private class MockResponseNotifier extends ResponseNotifier implements EnhancedInstance { - public MockResponseNotifier(HttpClient client) { - super(client); + public MockResponseNotifier() { + super(); } @Override diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java index e4a861fbc7..6f9d2ec489 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java @@ -34,6 +34,7 @@ import org.apache.skywalking.apm.agent.test.tools.SpanAssert; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.HttpConversation; import org.eclipse.jetty.client.HttpRequest; import org.junit.Assert; import org.junit.Before; @@ -67,7 +68,7 @@ public class SyncHttpRequestSendInterceptorTest { @Before public void setUp() throws Exception { - enhancedInstance = new MockHttpRequest(httpClient, uri); + enhancedInstance = new MockHttpRequest(httpClient, new HttpConversation(), uri); allArguments = new Object[] { "OperationKey", "OperationValue" @@ -123,8 +124,8 @@ public void testMethodsAroundError() throws Throwable { } private class MockHttpRequest extends HttpRequest implements EnhancedInstance { - public MockHttpRequest(HttpClient httpClient, URI uri) { - super(httpClient, uri); + public MockHttpRequest(HttpClient client, HttpConversation conversation, URI uri) { + super(httpClient, conversation, uri); } @Override diff --git a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java index d45d8adfed..4e31db9383 100644 --- a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java +++ b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.apm.testcase.jettyclient.contr; +package org.apache.skywalking.apm.testcase.jettyclient.controller; import javax.annotation.PostConstruct; import java.io.IOException; @@ -26,6 +26,8 @@ import org.apache.http.impl.client.HttpClients; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; +import org.eclipse.jetty.client.util.BufferingResponseListener; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Controller; @@ -51,13 +53,19 @@ public void init() throws Exception { @ResponseBody public String jettyClientScenario() throws Exception { client.newRequest("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0").send(); - Response.CompleteListener listener = result -> { - CloseableHttpClient httpclient = HttpClients.createDefault(); - HttpGet httpget = new HttpGet("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0"); - try { - httpclient.execute(httpget); - } catch (IOException e) { - throw new RuntimeException(e); + Response.Listener listener = new BufferingResponseListener() { + public void onComplete(Result result) { + byte[] bytes = this.getContent(); + if (bytes == null || bytes.length == 0) { + throw new RuntimeException("content cant be empty"); + } + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpGet httpget = new HttpGet("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0"); + try { + httpclient.execute(httpget); + } catch (IOException e) { + throw new RuntimeException(e); + } } }; client.newRequest("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-1").send(listener); diff --git a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java index 667fdafd16..4075fc0e34 100644 --- a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java +++ b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java @@ -19,6 +19,7 @@ package org.apache.skywalking.apm.testcase.jettyserver.servlet; import java.io.IOException; +import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -31,6 +32,9 @@ public class AsyncCaseServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { Thread.sleep(2000); + resp.setContentType("text/plain;charset=UTF-8"); + PrintWriter out = resp.getWriter(); + out.print("Success"); } catch (InterruptedException e) { } } diff --git a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java index 9dfae15f64..22b6eeac90 100644 --- a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java +++ b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java @@ -19,6 +19,7 @@ package org.apache.skywalking.apm.testcase.jettyserver.servlet; import java.io.IOException; +import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -31,6 +32,9 @@ public class CaseServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { Thread.sleep(2000); + resp.setContentType("text/plain;charset=UTF-8"); + PrintWriter out = resp.getWriter(); + out.print("Success"); } catch (InterruptedException e) { } }