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