我们很难使用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上是否有任何报告的错误?
如果您需要任何其他信息,可以添加评论。
最好的问候。