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 > > > > > > > > >
