Reading through that I'm still not clear.. Is the bus associated to
the running JVM and shared for all ports, or is it per-port?
To rephrase back to my actual problem, which is painfully high memory
usage when trying to talk to a complex endpoint where the WSDL is
just under a meg, particularly when used against multiple endpoints
from multiple threads.
1) Is it safe to use a single port from multiple threads concurrently?
2) Is it safe to use multiple ports to different endpoints within a
thread concurrently?
3) Is bus shutdown the proper way to free the 20 MB or so per thread/
port when I'm done with a port (but not done using CXF in my
application)
4) Is there any way CXF can re-use all or some of the service model
objects it builds from a WSDL the next time I bind it against a
different endpoint? It seems like 98% of that 20 MB model should be
the same objects every time.
--Joe
On Sep 7, 2007, at 2:59 AM, Willem Jiang wrote:
Hi
If you use the Jaxws API getPort to create the client proxy. CXF
will try to get a default bus first ,
if the default bus is not exit, it will create a bus and set
default bus and default thread local bus for you.
So the thread local object in your case should be the bus :)
Here are some code snippets which can help you to know better about
the default Bus and bus.shutdown()
1. Bus creation
public CXFBusImpl(Map<Class, Object> extensions) {
if (extensions == null) {
extensions = new ConcurrentHashMap<Class, Object>();
} else {
extensions = new ConcurrentHashMap<Class, Object>
(extensions);
}
this.extensions = extensions;
state = BusState.INITIAL;
CXFBusFactory.possiblySetDefaultBus(this);
}
2. CXFBusFactory.possiblySetDefaultBus(this);
public static synchronized boolean possiblySetDefaultBus(Bus bus) {
// there is a thread location variable which store the
default thread local bus
if (localBus.get() == null) {
localBus.set(bus);
}
if (defaultBus == null) {
defaultBus = bus; return true;
}
return false;
}
3. CXFBusImpl.shutdown(boolean wait)
public void shutdown(boolean wait) {
BusLifeCycleManager lifeCycleManager = this.getExtension
(BusLifeCycleManager.class);
if (null != lifeCycleManager) {
lifeCycleManager.preShutdown();
}
synchronized (this) {
state = BusState.SHUTDOWN;
notifyAll();
}
if (null != lifeCycleManager) {
lifeCycleManager.postShutdown();
}
if (BusFactory.getDefaultBus(false) == this) {
BusFactory.setDefaultBus(null);
}
}
You can find more information about bus by reading the source code.
CXFBusImpl https://svn.apache.org/repos/asf/incubator/cxf/trunk/rt/
core/src/main/java/org/apache/cxf/bus/CXFBusImpl.java
CXFBusFactory https://svn.apache.org/repos/asf/incubator/cxf/trunk/
rt/core/src/main/java/org/apache/cxf/bus/CXFBusFactory.java
Willem.
Joe Sunday wrote:
Is that a done with the client or done with the application call?
If there's something I need to call when I'm done with a
particular port, I can deal with that. I don't see it documented
anywhere though.
--Joe
On Sep 6, 2007, at 3:21 PM, Daniel Kulp wrote:
Joe,
One thing to keep in mind: the Bus would still be around. You'd
need to
get the default Bus and call shutdown() on it if you're
completely done.
Dan
--
J. Daniel Kulp
Principal Engineer
IONA
P: 781-902-8727 C: 508-380-7194
[EMAIL PROTECTED]
http://www.dankulp.com/blog