#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 и потерпел неудачу, я решил проблему с помощью стандартного асинхронного подхода к веб-сервису. Спасибо Дэвиду за помощь, ценю ваше время.