Apache CXF响应缓慢

时间:2017-09-12 10:13:39

标签: java spring web-services soap cxf

我们很难使用apache cxf。

我们使用的是Apache CXF 2.2.5'和Spring Framework 3.2.10'用于我们系统中的SOAP服务。

这是我们系统的简要图表 (见下文)

+--------+        +--------------+          +---------------------+   +----------------
| L4     |-- RB --| Apache Httpd |- mod_jk -| JBoss AS            |---| Spring Framework 3.2.10
| Switch |        | 2.2.27 (2EA) |          | 7.1.1 (2EA x 4INST) |   | Apache CXF 2.2.5 / JDK 7
+--------+        +--------------+          +---------------------+   +----------------

APM系统告诉我们,当SOAP消息传入大约100 TPS时,由于其中一个apache cxf方法ServletDestination.invoke(),我们的系统中存在响应延迟。

报告ServletDestination.invoke()每次交易花费超过70秒。

我们的SIB(服务实现Bean)工作正常(花费在1秒以下)。

我们所有的系统操作系统参数设置都很好。

- open files max : 32767
- max processes : 300000

mod_jk设置如下(每个jboss实例)

- socket_keepalive=true
- socket_timeout=300
- connection_pool_size=500
- connection_pool_minsize=300
- connection_pool_timeout=60

ServletDestination.invoke()方法的来源,Apache CXF 2.2.5

public void invoke(final ServletConfig config,
                   final ServletContext context, 
                   final HttpServletRequest req, 
                   final HttpServletResponse resp) throws IOException {

    MessageImpl inMessage = new MessageImpl();
    setupMessage(inMessage,
                 config,
                 context,
                 req,
                 resp);

    ExchangeImpl exchange = new ExchangeImpl();
    exchange.setInMessage(inMessage);
    exchange.setSession(new HTTPSession(req));
    inMessage.setDestination(this);

    incomingObserver.onMessage(inMessage);

}

AbstractHTTPDestination.setupMessage()中调用的ServletDestination.invoke()方法的源代码,Apache CXF 2.2.5

protected void setupMessage(Message inMessage,
                            final ServletConfig config,
                            final ServletContext context, 
                            final HttpServletRequest req, 
                            final HttpServletResponse resp) throws IOException {

    inMessage.setContent(InputStream.class, req.getInputStream());
    inMessage.put(HTTP_REQUEST, req);
    inMessage.put(HTTP_RESPONSE, resp);
    inMessage.put(HTTP_CONTEXT, context);
    inMessage.put(HTTP_CONFIG, config);

    inMessage.put(Message.HTTP_REQUEST_METHOD, req.getMethod());
    inMessage.put(Message.REQUEST_URI, req.getRequestURI());
    String contextPath = req.getContextPath();
    if (contextPath == null) {
        contextPath = "";
    }
    inMessage.put(Message.PATH_INFO, contextPath + req.getPathInfo());
    ....
    ....
}

我们的系统有什么问题,如何解决这个问题呢? 在CXF的ServletDestination上是否有任何报告的错误?

如果您需要任何其他信息,可以添加评论。

最好的问候。

0 个答案:

没有答案