Ant Kutschera
Ant Kutschera

Reputation: 6588

JAX-WS Client Pool in a Java EE App Server

I have an application running in a Java EE App Server and it needs to call a web service of a partner company.

Using wsimport.exe from my JDK (1.6) I have generated the client classes. I instantiate the service and get the port in order to call the web service.

I noticed that the first call to the web service is slow, and I am led to believe this is because it is validating the WSDL. Subsequent calls are fast.

I could keep the WSDL locally, and apparently that will speed up the first call.

In order to optimise my app, I was thinking I could create a pool of the clients. This has the added advantage that I have some throttling in the app - lets say I have a pool of 5 clients, then at most I will be using memory for 5 clients. If the load increased suddenly on my server, I don't have to worry that an unlimited number of clients would cause an out of memory error. I am assuming, based on past experience, that the web service clients use a lot of memory...

Upvotes: 3

Views: 4237

Answers (3)

Ant Kutschera
Ant Kutschera

Reputation: 6588

AKKA with a master/slave setup as shown in the link could work well, albeit a little more complex than the Apache Commons Pool listed in another answer. AKKA also uses an execution pool, with its own threads, which isn't strictly allowed in the Java EE world, although I'd argue that because a well tested framework is in charge of the threads, there is no danger, and it shouldn't interfere with the app servers control of threads anyway as the number of threads being handled by AKKA is minimal.

Upvotes: 0

Ant Kutschera
Ant Kutschera

Reputation: 6588

The Apache Commons Pool might be exactly what I am after.

It is configurable and seems to have thought of everything.

Upvotes: 4

Ant Kutschera
Ant Kutschera

Reputation: 6588

A colleague of mine suggested that you can use the @WebServiceRef annotation on a field in an EJB. The idea is that the server would inject a reference to a client, from which one can create a port for each thread that calls the EJB.

I assume that injected references come from a pool, although the specification doesn't appear to talk about this. The Javadoc for the annotation explicitly mentions that:

"the injected references are not thread safe"

Upvotes: 0

Related Questions