2

Web サービスを呼び出すクライアントがあります。呼び出されたメソッドの一部は、サーバー上で完了するまでに長い時間がかかる場合があります (最大 1 時間)。クライアントにその時間の応答を待機させて、接続を維持したい!

クライアント内で次のプロパティを設定しようとしましたが、成功しませんでした:

((BindingProvider)port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 0); //0 for disabling any timeouts

しばらくしてもタイムアウト例外が発生します。次のエラーを防ぐために設定する必要があるプロパティはどれですか?

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
4

1 に答える 1

12

これがクライアント側のタイムアウトであると確信していますか? サーバー トランザクション タイムアウトを適切に構成しましたか?

クライアント側のタイムアウトの場合、cxf 構成で必要になります。

<http-conf:conduit name="*.http-conduit">
    <http-conf:client ConnectionTimeout="your connection timeout" ReceiveTimeout="your receive timeout"/>
</http-conf:conduit>

タイムアウトはミリ秒単位で表されます。

Java コードでは、HTTPConduit を取得してから HTTPClientPolicy を設定する必要があります。

http://cxf.apache.org/docs/client-http-transport-included-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");

アップデート

java.lang.ClassCastExceptionクラスパスにないことを確認するかcom.sun.xml.ws.client.sei.SEIStub、クラスパスで cxf jar が Sun の jaxws RI jar の前にあることを確認してください。たとえば、クラスパスから jaxws-rt*.jar を削除してみてください。

于 2012-10-16T09:33:54.760 に答える