cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <ning.ji...@iona.com>
Subject Re: Memory leak in client?
Date Tue, 11 Sep 2007 02:12:25 GMT
Hi Joe,

Yes, you could set a bus to all your port, but you need write some no 
JAX-WS compatible codes.

Here is a code snippet for setting the default bus for all the thread

Bus bus = BusFactory.createBus();
// in you working thread start up
BusFactory.setDefaultBus(bus);
BusFactory.setThreadDefaultBus(bus);
// then just use the JAX-WS API to get the port.

Please see my other comments in the mail.

Joe Sunday wrote:
> 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?
I don't think so.
> 2) Is it safe to use multiple ports to different endpoints within a 
> thread concurrently?
It should be safe.
> 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)
 It is no need for us the shutdown the bus per port invocation , because 
it will take a long time to load a bus.
> 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.
The bus holds the reference of WSDL manager which holds the WSDL 
definitions which will eat up lots of memory for big wsdl file. If we 
share a same bus with all the ports, I think the memory consumption will 
be a low level.
>
> --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
>>>> daniel.kulp@iona.com
>>>> http://www.dankulp.com/blog
>>>
>
Willem.

Mime
View raw message