Thank you Freeman, that's working now.

Jim

On Wed, Dec 14, 2011 at 07:19:15PM +0800, Freeman Fang wrote:
> Hi,
> 
> I'd say use spring configuration is the simple way.
> Use java code to configure it is a little bit complex which means you  
> have to use cxf api, but it's still possible. Use some code like
>       JettyHTTPServerEngineFactory factory = new  
> JettyHTTPServerEngineFactory();
>       engine = new JettyHTTPServerEngine();
>          engine.setJettyHTTPServerEngineFactory(factory);
>          engine.setPort(9235);//assume 9235 is the port which you  
> publish servcie
>          engine.setMaxIdleTime(300000);//or whatever idle time you want
>          engine.finalizeConfig();
>          List<JettyHTTPServerEngine> list = new  
> ArrayList<JettyHTTPServerEngine>();
>          list.add(engine);
>          factory.setEnginesList(list);
> 
> before your
>          server = serverFactory.create();
> 
> the idea which works under the hood is that the  
> JettyHTTPServerEngineFactory maintain a static map which map port and  
> JettyHTTPServerEngine instance, so that any JettyHTTPServerEngine  
> instance in same JVM could be retrieved later on, from this way you  
> can configure the maxIdleTime with java code.
> 
> Freeman
> On 2011-12-14, at 下午5:44, James Talbut wrote:
> 
> > Ah, thank you.
> > How can I set the maxIdleTime without using Spring?
> >
> > In the code I'm using the JettyHttpServerEngine and the Connector  
> > are both created during serverFactory.create - and the maxIdleTime  
> > is only used when creating the Connector.
> >
> > Jim
> >
> > On Wed, Dec 14, 2011 at 02:23:30PM +0800, Freeman Fang wrote:
> >> 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
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> 
> ---------------------------------------------
> Freeman Fang
> 
> FuseSource
> Email:[email protected]
> Web: fusesource.com
> Twitter: freemanfang
> Blog: http://freemanfang.blogspot.com
> 
> 
> 
> 
> 
> 
> 
> 
> 

Reply via email to