mule асинхронный поток ws вызов вызывает тайм-аут чтения

#java #web-services #mule #mule-studio

#java #веб-сервисы #mule #mule-studio

Вопрос:

У меня есть вопрос, который нужно задать. Мой случай таков: у меня есть quartz: входящая конечная точка, которая запускает мой пользовательский преобразователь ContractStarter. Этот преобразователь имеет внутри веб-сервис вызова WebService.doStuf() . Несмотря на то, что он объявлен в области async, когда для ответа ws требуется слишком много времени, я получаю исключение SocketTimeoutException: время ожидания чтения истекло. Чего я хочу, так это заставить этот вызов работать как область асинхронного действия, не дожидаясь ответа и не вызывая исключений тайм-аута, потому что ответ не важен.

мой xml выглядит так

 http:endpoint  name="httpIn"  address="${service.proxy.soap}" responseTimeout="30000" exchange-pattern="one-way" />
http:endpoint  name="httpOut"  address="${service.soap}" responseTimeout="30000" exchange-pattern="one-way" />

<pattern:web-service-proxy 
    name="muleServiceProxy" 
    inboundEndpoint-ref="httpIn" 
    outboundEndpoint-ref="httpOut" />

<spring:bean name="contractStarter" class="com.mule.scheduler.ContractStarter">
    <spring:property name="webService" ref="realWebService"></spring:property>
</spring:bean>

<queued-asynchronous-processing-strategy name="allowFiveThread" maxThreads="30" />

<flow name="contractQuartzScheduler">
    <quartz:inbound-endpoint startDelay="3000" jobName="contractBecome" cronExpression="0 0/2 7-23 * * ?">
        <quartz:event-generator-job/>
    </quartz:inbound-endpoint>
    <async processingStrategy="allowFiveThread">
    <component>
        <spring-object bean="contractStarter"/>
    </component>
    </async>
</flow>
  

служба «webservice» определяется как:

  jaxws:client id="realWebService" serviceClass="com.wsdl._2011.WebService" address="${httpIn}"
  

и мой пользовательский преобразователь contractStarter:

 public class ContractStarter implements Callable {

private static Logger log = Logger.getLogger(ContractStarter.class);

private WebService webService;


@Override
public Object onCall(MuleEventContext arg0) throws Exception {
    try {
        log.info("Starting ContractStarter");

        Header requestHeader = JAXBStubsUtil.createHeader(new Date().toString(), "starContract", "MULE");
        Holder<Header> responseHeader = new Holder<Header>();
        MyRequestMessage request = new MyRequestMessage();
        Holder<MyResponseMessage> response = new Holder<MyResponseMessage>();
        webService.doStuff(requestHeader, request, responseHeader, response);
        return response;
    } catch (Exception e) {
        log.error(e,e);
        throw e;
    }
}
  

Стек исключений:

Стек исключений:

 1. Read timed out (java.net.SocketTimeoutException)
  java.net.SocketInputStream:-2 (null)
2. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=http://localhost:8080/WebService, connector=HttpConnector
{
  name=HttpConnector1
  lifecycle=start
  this=5025536c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[http]
  serviceOverrides=<none>
}
--------------------------------------------------------------------------------
Root Exception stack trace:
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
      3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

ERROR 2014-06-13 09:36:28,514 [[mule-axioma-services].ContractStarterScheduler.async1.01] com.mule.scheduler.ContractStarter: javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader.
javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
    at $Proxy85.doBatch(Unknown Source)
    at com.mule.scheduler.ContractStarter.onCall(ContractStarter.java:52)
    at org.mule.model.resolvers.CallableEntryPointResolver.invoke(CallableEntryPointResolver.java:50)
    at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:39)
    at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:350)
    at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:86)
    at org.mule.component.AbstractJavaComponent.doInvoke(AbstractJavaComponent.java:77)
    at org.mule.component.AbstractComponent.invokeInternal(AbstractComponent.java:126)
    at org.mule.component.AbstractComponent.access$000(AbstractComponent.java:61)
    at org.mule.component.AbstractComponent$1$1.process(AbstractComponent.java:242)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:64)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:56)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:64)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:87)
    at org.mule.component.AbstractComponent.process(AbstractComponent.java:160)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:64)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:56)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:64)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:87)
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:105)
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
    at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:111)
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:158)
    at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:43)
    at org.mule.work.WorkerContext.run(WorkerContext.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'F' (code 70) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
    at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:644)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2003)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1100)
    at com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1123)
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:122)
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:755)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2330)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2192)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2036)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:696)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
    ... 30 more
  

Комментарии:

1. Класс, сообщающий об ошибке com.axa.mule.scheduler.ContractBecomeInforceStarter , не ContractStarter является: у вас запущено сочетание конфигураций? Кроме того, почему бы не использовать стандартный клиент веб-службы вместо создания собственного вызываемого компонента?

2. @David, спасибо за быстрый ответ. Этот журнал взят из прошлого, перед рефакторингом. Ошибка в com.mule. ContractStarter, и я не знаю, как заставить его работать асинхронно. Вызываемый — это требование, установленное нашим проектом

3. Хорошо, круто. Как вы можете видеть в стеке, проблема на самом деле не в тайм-ауте, а в: Unexpected character 'F' (code 70) in prolog; expected '<' . Удаленная служба возвращает вам что-то, что не является XML…

4. спасибо за ответ. Я бы присмотрелся к нему завтра, когда буду на работе. На данный момент я хотел бы спросить, правильно ли я выполняю задачу, чтобы выполнить асинхронный вызов ws? Есть ли какие-либо другие возможности?

5. processingStrategy="allowFiveThread" Включение async странно: у вас никогда не должно быть более одного потока одновременно, поскольку конечная точка Quartz будет запускаться только каждые два часа. Даже async блок является спорным: почему бы просто не переключиться на поток Quartz, поскольку это срабатывает медленно, и вызов веб-сервиса будет выполнен (или истекло время ожидания) перед следующим опросом…

Ответ №1:

ну, после небольшой попытки заставить его работать как асинхронный поток в mule и потерпел неудачу, я решил проблему с помощью стандартного асинхронного подхода к веб-сервису. Спасибо Дэвиду за помощь, ценю ваше время.