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


Reply via email to