[英]Timeout for Webservice response?
I have a client that calls a webservice. 我有一个调用web服务的客户端。 Partly some of the called methods may take a long time to complete on the server (even up to 1 hour). 部分被调用的方法可能需要很长时间才能在服务器上完成(甚至长达1小时)。 I want the client to wait for the response for that time, thus keeping the connection alive! 我希望客户端等待那段时间的响应,从而保持连接的活跃!
I tried to set the following property within the client, but without success: 我试图在客户端中设置以下属性,但没有成功:
((BindingProvider)port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 0); //0 for disabling any timeouts
I'm still getting Timeout Exception after some time. 一段时间后我仍然会收到Timeout Exception。 Which property has to be set to prevent the following error? 必须设置哪个属性以防止出现以下错误?
org.apache.cxf.interceptor.Fault: Transaction was rolled back, presumably because setRollbackOnly was called during a synchronization while invoking public abstract boolean my.method
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:166)
at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.createFault(AbstractJAXWSMethodInvoker.java:213)
at org.apache.openejb.server.cxf.ejb.EjbMethodInvoker.preEjbInvoke(EjbMethodInvoker.java:146)
at org.apache.openejb.server.cxf.ejb.EjbMethodInvoker.invoke(EjbMethodInvoker.java:72)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
at org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:73)
at org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.openejb.core.transaction.TransactionRolledbackException: Transaction was rolled back, presumably because setRollbackOnly was called during a synchronization
at org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:335)
at org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75)
at org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:73)
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:258)
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:190)
at org.apache.openejb.server.cxf.ejb.EjbMethodInvoker.preEjbInvoke(EjbMethodInvoker.java:119)
... 30 more
Caused by: javax.transaction.RollbackException: Unable to commit: transaction marked for rollback
at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:272)
at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252)
at org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:328)
... 35 more
Caused by: java.lang.Exception: Transaction has timed out
at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:266)
... 37 more
Are you sure that this is a client side timeout? 您确定这是客户端超时吗? Did you configure your server transaction timeout properly? 您是否正确配置了服务器事务超时?
For client side timeout you need in your cxf configuration: 对于客户端超时,您需要在cxf配置中:
<http-conf:conduit name="*.http-conduit">
<http-conf:client ConnectionTimeout="your connection timeout" ReceiveTimeout="your receive timeout"/>
</http-conf:conduit>
Timeouts are expressed in milliseconds. 超时以毫秒表示。
In Java code you need get the HTTPConduit and then set HTTPClientPolicy: 在Java代码中,您需要获取HTTPConduit,然后设置HTTPClientPolicy:
see from http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html 请参阅http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
...
URL wsdl = getClass().getResource("wsdl/greeting.wsdl");
SOAPService service = new SOAPService(wsdl, serviceName);
Greeter greeter = service.getPort(portName, Greeter.class);
// Okay, are you sick of configuration files ?
// This will show you how to configure the http conduit dynamically
Client client = ClientProxy.getClient(greeter);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(your connection timeout);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setReceiveTimeout(your receive timeout);
http.setClient(httpClientPolicy);
...
greeter.sayHi("Hello");
Update 更新
For your java.lang.ClassCastException
make sure that com.sun.xml.ws.client.sei.SEIStub
is not in classpath or ensure that cxf jar is before Sun's jaxws RI jar in the classpath. 对于java.lang.ClassCastException
确保com.sun.xml.ws.client.sei.SEIStub
不在类路径中,或者确保cxf jar在类路径中的Sun的jaxws RI jar之前。 For example try removing jaxws-rt*.jar from your classpath. 例如,尝试从类路径中删除jaxws-rt * .jar。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.