【发布时间】:2019-01-30 15:04:30
【问题描述】:
对于我们的一个项目,我们正在使用 java jersey 客户端使用 HTTP 提要流
客户端Feed消费正常,但10分钟后,流异常掉线;即使流生产者已启动并运行并生成流
这是我尝试过的;
import java.util.Date;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.ChunkedInput;
public class StreamClient {
private static final String BOUNDARY = "\n";
public void makeCall() {
System.out.println("Start Time"+ new Date()) ;
Client client = ClientBuilder.newClient();
BasicAuth auth = new BasicAuth();
auth.setPassword("username");
auth.setUserName("password");
BasicAuthentication basicAuthentication = new BasicAuthentication(auth);
client.register(basicAuthentication);
WebTarget target = client.target("https://localhost:7211/stream/v1/");
Builder request = target.request(MediaType.APPLICATION_JSON);
Response response = request.get();
final ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {
});
chunkedInput.setParser(ChunkedInput.createParser(BOUNDARY));
String chunk;
do {
if((chunk = chunkedInput.read()) != null)
System.out.println(chunk);
}while (!chunkedInput.isClosed());
System.out.println("End Time " + new Date());
}
public static void main(String[] args) {
StreamClient client = new StreamClient();
client.makeCall();
}
}
如果流不掉线;线程必须在 while 循环内;一旦流关闭,线程就会出来并打印 sysout 语句
问题来了;为什么 chunkedinput 被关闭了。
这里,对于服务器端的每个有效负载/块分离,它都是 \r\n 并使其与服务器的连接处于活动状态,发送 \n (在客户端,我必须忽略这一点。)
【问题讨论】:
-
我认为这里有两种思路。流从服务器关闭,在这种情况下,您需要检查服务器日志并查看流已关闭的原因,或者中间有人正在终止流。例如连接超时。 10 分钟是很长的时间,如果您的码头没有超时,则可能涉及负载均衡器或其他方。
-
@Alexandar,我没有设置任何客户端或服务器端的超时配置,默认情况下球衣客户端的连接超时是无限的。
-
在服务器日志中验证,没有发现任何与连接断开相关的内容,不幸的是在客户端,没有用于 jersey 客户端调试的 log4j 配置;
-
您可以做的另一件事是检查响应代码,例如它是 200(OK),那么您可以假设您的请求的处理进展顺利,否则以某种方式处理它(阅读 http 标头,也许有一些关于原因的信息,登录到 system.err 等),或者忽略这个失败的请求,这取决于你。
-
尝试连续ping客户端,看看有没有丢包或者断断续续的连接超时
标签: java jersey jersey-client