当我的JAX-RS应用程序无法发送响应时,我可以记录吗? (怎么样?)

时间:2017-12-08 22:14:42

标签: java jax-rs java-ee-6

我在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中有解决方案,我也想听听它们。无论如何我们很快就会升级。

2 个答案:

答案 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)

嗯,对不起,我明白了。您可以使用已经使用的过滤器,甚至可以添加一个单独的ResponseFilter来捕获从您身边发送的所有实际响应(请参阅例如Logging request and response in one place with JAX-RS),这可以说是证明了这一点。证明他们实际收到你的回答是完全不同的;如果客户以编程方式访问您的API,则没有其他方式可以掌握他们的传输日志记录,或者让客户访问并帮助他们进行设置:您确实有共同的兴趣来解决这个问题,对吧?它们只是浏览你的API然后..我不知道,前者是你唯一的选择吗?

  • 在您发表评论之后再发表一些意见:

是的,正如我所说,过滤器,即使工作,也不会说明您的回复的实际交付情况。例如,我现在有时会被抛入这个东西,然后我们通过VPN进行限制点对点访问,双向进行SSL验证,双方都有重防火,然后在路上有我们和目的地之间的许多代理人。在大多数情况下,我们充当客户端,并且多次发生我们的fw遇到某种问题或者我们的某些代理服务器配置错误或关闭,或者SSL证书已过期或仅仅是我们的网络问题侧。在这些情况下,远程服务器无法告知出现任何问题,他们只是回应 - 是您,客户端,有问题而且在您身边,只要您无法阅读响应,就会弹出错误。所以......我猜这里没有任何明显的避免显而易见的事情,首先你要做的就是问他们,“你怎么认为没有回应”?超时/套接字关闭?不同类型的错误通常表示其产生的域。然后你只需跟踪跟踪,你就会找到终止点。然而,在你的情况下它似乎发生..“有时”而不是你的网络切换“关闭” - 然后我会,如果他们发送给我的错误日志没有告诉我到底发生了什么,请问客户他们是什么客户端实际上在做。它们是否有可能连接单线程,并且在读取当前响应之前发出另一个请求?已经看到陌生的东西(和更可怕的代码)执行,对吧?我想我只是说你不应该专注于你的API,它可能有效,专注于实际的客户端,与你的服务器相比,它应该做两件事而不是一件。