Hi,

Yeah, I've encountered same issue before.

The key reason of this behavior is that on the server side the service process take a very long time, let's say 10 mins, so the connection between client and server become kinda of idle, for me in this case only configure client side connectionTimeout and receiveTimeOut isn't enough, we also need configure jetty server connector to set a longer maxIdleTime(the default value is 200 sec, that's why you see resend every 200 sec) which can honor this long connection idle,

If you use more recent released cxf version(2.3.7,2.4.3, 2.5) then you can specify the maxIdleTime on JettyHttpServerEngine directly, we have a issue CXF-3833[1] to track it

If you use some old cxf version, I believe the httpj:connector here[2] should also work, you need add a httpj:connector and specify maxIdleTime for it

[1]https://issues.apache.org/jira/browse/CXF-3833
[2]http://cxf.apache.org/docs/jetty-configuration.html

Freeman

On 2011-12-14, at 上午3:25, Jim Talbut wrote:

Hi,

I've got a SOAP operation that takes a long time to complete (in fact, I expect it to timeout, but I need that controlled by my code server side so it's not relevant to this). When I call the operation it blocks, as expected, but then after ~200s I see the operation called again. It isn't called by my code, so I think it's happening within CXF somewhere, but I can't work out where.

My web service client is set up like this:
       proxyFactory = new JaxWsProxyFactoryBean();
       proxyFactory.setServiceClass(IGenericConversion.class);
       proxyFactory.setAddress( url );

       client = (IGenericConversion)proxyFactory.create();
       BindingProvider binder = ( BindingProvider ) client;

       HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
       httpClientPolicy.setConnectionTimeout( 10000 );
       httpClientPolicy.setAllowChunking( false );
       httpClientPolicy.setReceiveTimeout( 600 * 1000 );
       httpClientPolicy.setMaxRetransmits( 0 );
// httpClientPolicy.setProxyServer( "localhost" ); // Fiddler, sometimes
       // httpClientPolicy.setProxyServerPort( 8888 );

HTTPConduit http = ( HTTPConduit ) org.apache.cxf.frontend.ClientProxy.getClient( client ).getConduit();
       http.setClient( httpClientPolicy );
And called like this:
log.debug( "{}: Requesting conversion of {} to {}", new Object[]{ request.getCorrelationId(), request.getFileName(), request.getDestinationFormat() } );
       ConversionResult result = client.convert( request );

The server is set up like this:
       url = "http://localhost:"; + findFreePort() + "/pdf";
       log.debug( "Conversion web service URL: {}", url );

       if( server == null ) {
           conversionService = new ConversionWebService();
           serverFactory = new JaxWsServerFactoryBean();
           serverFactory.setServiceClass(ConversionWebService.class);
           serverFactory.setAddress( url );
           serverFactory.setServiceBean( conversionService );
           server = serverFactory.create();
       }
       server.start();
       log.debug( "server is {}", server );

       servletContext = new MockServletContext();
servletContext.addInitParameter( "office.port", Integer.toString( findFreePort() ) );
       servletContext.addInitParameter( "office.instances", "1" );
       WebappContext.init(servletContext);
conversionService .setWebappContext( WebappContext.get( servletContext ) );
And the operation implementation contains this:
   public ConversionResult convert( ConversionRequest parameters ) {

       try {
           ... // Parameter checking, no loops, honestly
log.debug( "{}: Converting file \"{}\" to {} ({} bytes)", new Object[]{
                   parameters.getCorrelationId(),
                   parameters.getFileName(),
                   destinationFormat,
                   parameters.getContent().length
               } );

And when I run it I'm getting:
Line 704: 15:33:00.977 [main] DEBUG c.g.j.s.BaseWebServiceTest - [BaseWebServiceTest.java(224) BaseWebServiceTest::convertFileToResult] 841627bf-5d24-4d51-aef2- a12693e7850f: Requesting conversion of Tardis.docx to PDF Line 844: 15:33:01.157 [qtp1672848394-16 - /pdf] DEBUG c.g.j.s.ConversionWebService - [ConversionWebService.java(84) ConversionWebService::convert] 841627bf-5d24-4d51-aef2-a12693e7850f: Converting file "Tardis.docx" to PDF (32620 bytes) Line 886: 15:36:21.498 [qtp1672848394-18 - /pdf] DEBUG c.g.j.s.ConversionWebService - [ConversionWebService.java(84) ConversionWebService::convert] 841627bf-5d24-4d51-aef2-a12693e7850f: Converting file "Tardis.docx" to PDF (32620 bytes) Line 925: 15:36:51.504 [qtp1672848394-18 - /pdf] DEBUG c.g.j.s.ConversionWebService - [ConversionWebService.java(214) ConversionWebService::convert] 841627bf-5d24-4d51-aef2-a12693e7850f: Conversion complete, file "Tardis.docx" to "null" (0 bytes) took 30.005s: null Line 1094: 15:36:51.539 [qtp1672848394-16 - /pdf] DEBUG c.g.j.s.ConversionWebService - [ConversionWebService.java(214) ConversionWebService::convert] 841627bf-5d24-4d51-aef2-a12693e7850f: Conversion complete, file "Tardis.docx" to "null" (0 bytes) took 230.377s: null Two calls to the implementation, 200s apart, but only one call from the client.

I hope this is blindingly obvious to someone in the know 'cos it's driving me insane now.
Thanks.

Jim

---------------------------------------------
Freeman Fang

FuseSource
Email:[email protected]
Web: fusesource.com
Twitter: freemanfang
Blog: http://freemanfang.blogspot.com









Reply via email to