Hi,
Would you please dump thread stack trace when the process hang?
Regards
Freeman
Crimor wrote:
Hi,
I have a cxfse-su Orderservice which should send a message to an cxfbc-su
CRMService. This works fine on low traffic but if on high traffic it seems
that the sendSync hangs up.
So I started an JMeter load tests and I take only 3 users which cause 500
request and everything works fine but if I increase the users to > 4 it
seems that the sendsync hangs up. Without the sendSync and both services
testet separately the cxf OrderService and cxf CRMService works fine within
50 users performing 1000 requests.
Flow:
client ---> cxfbc-su OrderService --> cxfse-su OrderService ---sendSync-->
cxfbc-su CRMService ---> cxfse-su CRMService --- reponse to --> cxfse-su
OrderService --response to -> client
CXF-BC CRMSERVICE xbean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
xmlns:order="http://test.net/crmservice/v1/">
<!-- Loads the configuration-->
<bean
class="xxx.xxx.xxxx.common.util.spring.StagePropertiesPlaceholderConfigurer"/>
<cxfbc:consumer
wsdl="classpath:crmService.wsdl"
targetService="order:CRMService"
targetInterface="order:crmServicePort"
timeout="${xxx.components.cxf-bc.timeout}"
locationURI="${xxx.components.crm.service.soapurl}"/>
</beans>
The CXF OrderService send method:
protected Source sendMessage(Source xmlMessage, QName serviceName, QName
interfaceName, QName operationName)
throws AdFusionException {
ServiceMixClient client = new ServiceMixClientFacade(context);
NormalizedMessage message = null;
InOut exchange = null;
try {
exchange = client.createInOutExchange();
message = exchange.getInMessage();
message.setContent(xmlMessage);
exchange.setService(serviceName);
exchange.setInterfaceName(interfaceName);
exchange.setOperation(operationName);
// sending the message
client.sendSync(exchange);
} catch (MessagingException e) {
StringBuilder sb = new StringBuilder();
logger.error("sendMessage() - " + sb.toString(), e);
throw new AdFusionException(sb.toString(), e);
}
// retrieving the answer
// logger.info("sendMessage() - exchange: " + exchange);
// logger.info("sendMessage() - exchange.getOutMessage(): " +
exchange.getOutMessage());
Source source = getContentFromMessage(exchange);
try {
client.done(exchange);
} catch (MessagingException e) {
String msg = "Error setting status of response to
ExchangeStatus.DONE";
logger.error("sendMessage() - " + msg + ": " + e.getMessage());
} finally {
try {
client.close();
} catch (JBIException e) {
String msg = "Error closing client";
logger.error("sendMessage() - " + msg + ": " + e.getMessage());
}
}
if (source == null) {
throw new AdFusionException("Source could not be retrieved from
exchange.");
}
return source;
}
private StringSource getContentFromMessage(InOut exchange) {
Source source = null;
if (exchange != null) {
if (exchange.getFault() != null) {
Fault fault = exchange.getFault();
logger.debug("getContentFromMessage() - retrieving fault: " +
fault);
source = fault.getContent();
} else {
if (exchange.getOutMessage() != null) {
NormalizedMessage message = exchange.getOutMessage();
logger.debug("getContentFromMessage() - retrieving message: " +
message);
source = message.getContent();
} else {
logger
.error("getContentFromMessage() - The CRM System did not
answer, exchange.getOutMessage() and exchange.getFault() is null. Please
check the CRM Log files.");
AdfError adfError =
errorHandler.getById(AdfErrorCode.NO_CRM_ANSWER);
throw new AdFusionException(AdfErrorCode.NO_CRM_ANSWER, adfError);
}
}
} else {
logger.error("getContentFromMessage() - exchange was null");
}
String resource = jbiWrapper.sourceToString(source, false, false);
StringSource stringSource = new StringSource(resource);
logger.debug("getContentFromMessage() - Returned source: " + resource);
return stringSource;
}
May you can help me?
Greetings
Stephan