我在EE6上运行JAX-RS Web服务(EAP 6.4,如果它起作用)。
我希望能够判断响应是否已传递给客户端,但我似乎无法接收错误。
我写了一个沙盒示例:
@POST
@Path("/delay")
@Produces(MediaType.APPLICATION_XML)
public String justWait(InputStream is) throws IOException, InterruptedException {
String theString = IOUtils.toString(is, "UTF-8");
log.info("Received body: " + theString);
log.info("Now waiting a bit");
Thread.sleep(5000);
log.info("Back, sending respoonse.");
return "<OK/>";
}
但无论我做什么,每当我发送POST时,日志输出都非常干净。点击REST插件中的“abort”?没有。关闭浏览器?安静。中途使用curl和Ctrl-C?不。
我正在使用javax.servlet.annotation.WebFilter
记录所有传入的请求,我也可以看到传出的响应,但此日志记录之后 <\ n>传递将失败。
如何判断我的回复未发送?
如果EE7中有解决方案,我也想听听它们。无论如何我们很快就会升级。
答案 0 :(得分:0)
尝试使用servlet过滤器在套接字过早关闭时捕获异常。确保它首先在你的web.xml中。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class StackHunterServletFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
try {
chain.doFilter(request, response2);
} catch (Throwable e) {
e.printStackTrace();
throw e;
}
} catch (IOException e) {
throw e;
} catch (ServletException e) {
throw e;
} catch (RuntimeException e) {
throw e;
} catch (Error e) {
throw e;
} catch (Throwable e) {
throw new ServletException(e.getMessage(), e);
}
}
}
答案 1 :(得分:0)
是的,正如我所说,过滤器,即使工作,也不会说明您的回复的实际交付情况。例如,我现在有时会被抛入这个东西,然后我们通过VPN进行限制点对点访问,双向进行SSL验证,双方都有重防火,然后在路上有我们和目的地之间的许多代理人。在大多数情况下,我们充当客户端,并且多次发生我们的fw遇到某种问题或者我们的某些代理服务器配置错误或关闭,或者SSL证书已过期或仅仅是我们的网络问题侧。在这些情况下,远程服务器无法告知出现任何问题,他们只是回应 - 是您,客户端,有问题而且在您身边,只要您无法阅读响应,就会弹出错误。所以......我猜这里没有任何明显的避免显而易见的事情,首先你要做的就是问他们,“你怎么认为没有回应”?超时/套接字关闭?不同类型的错误通常表示其产生的域。然后你只需跟踪跟踪,你就会找到终止点。然而,在你的情况下它似乎发生..“有时”而不是你的网络切换“关闭” - 然后我会,如果他们发送给我的错误日志没有告诉我到底发生了什么,请问客户他们是什么客户端实际上在做。它们是否有可能连接单线程,并且在读取当前响应之前发出另一个请求?已经看到陌生的东西(和更可怕的代码)执行,对吧?我想我只是说你不应该专注于你的API,它可能有效,专注于实际的客户端,与你的服务器相比,它应该做两件事而不是一件。