I just committed a fix to trunk (pulling back to 2.4.x now as well).   When 
you get a chance, can you give it a try to see if it fixes your issue?   
Threading things like these are hard to really test.

Dan


On Friday, August 19, 2011 2:32:03 PM xuhb wrote:
> Maybe it is becuase before chain.wait() return, the sync of chain  will be
> re-locked, so it will block untill chain.resume() finished;
 
> ----- Original Message ----- 
> From: "xuhb" <x...@tongtech.com>
> To: <users@cxf.apache.org>
> Sent: Friday, August 19, 2011 1:39 PM
> Subject: Re: A mysteriously deadlock of CXF OnewayProcessorInterceptor
> 
> 
> 
> > Sorry, I foget post the issue link:
> > 
> > https://issues.apache.org/jira/browse/CXF-3750
> > 
> > ----- Original Message ----- 
> > From: "xuhb" <x...@tongtech.com>
> > To: <users@cxf.apache.org>
> > Sent: Friday, August 19, 2011 1:34 PM
> > Subject: A mysteriously deadlock of CXF OnewayProcessorInterceptor
> > 
> > 
> > 
> >> Hi:
> >> 
> >>    Recently when I am checking/testing CXF , there is a
> >>    mysteriously deadlock of CXF Oneway Process; Normally  CXF
> >>    engine will  invoke the one way bussiness logical asynchronized
> >>    ,, so the servlet handle will finished and return back to
> >>    servlet engine immediately;
>> 
> >> 
> >> 
> >>    But sometime, I noticed that the servlet
> >>    handle(JettyHTTPHandler) at server side doesn't return back to
> >>    servlet engine(Jetty) immediately , it will waiting until the
> >>    asynchrouse business logical finished; 
 After dig source of
> >>    CXF, I   find it 's relate to OnewayProcessorInterceptor;But
> >>    until now I can only show  when will the deadlock occurs, but I
> >>    still can not explain why;>> 
> >> 
> >> Following is details:
> >> OnewayProcessInterceptor.handleMessage{
> >> synchronized (chain) {
> >> message.getExchange().get(Bus.class).getExtension(WorkQueueManager.cla
> >> ss)
 .getAutomaticWorkQueue().execute(new Runnable() {
> >> 
> >>    public void run() {
> >>    synchronized (chain) {
> >>    
> >>        System.out.println("--notify all");
> >>        chain.notifyAll();
> >>    
> >>    }
> >>    
> >>    chain.resume(); //if chain.resume is called  before chain.wait
> >>    finished ,  the dead lock will occurs;  It seems as
> >>    chain.resume is synchronized, so it will relock on chain
> >>    object, so the chain.wait() will deadlocked (... I feel
> >>    confused for this, because jdk doesn't say so...) ;After
> >>    chain.resume finished, locking on chain is released,  deadlock
> >>    of chain.wait()  is also released;  but I don't think this is
> >>    problem of CXF , maybe it's jdk's problem ?? I feels confused;
>>    
> >>      }
> >> 
> >> });
> >> 
> >>      System.out.println("--wait begin");
> >>      chain.wait(20);
> >>      System.out.println("--wait end");
> >> 
> >> }
> >> }
> >> syncrhonized PhaseInterceptorChain.resume(){
> >> 
> >>     System.out.println("--api chain resume");
> >>    
> >>    ...
> >> 
> >> }
> >> 
> >> if the execute sequence  as following, every thing is ok.  there is no
> >> dead lock;
>> 
> >>    chain.wait enter
> >>    chian.notify invoked
> >>    chain.wait return;
> >>    chain.resume(); //resume also synchronzed on chain object;
> >> 
> >> 
> >> if the execute sequence as following , dead lock will occurs:
> >> 
> >>    chain.wait enter
> >>    chain.notify 
> >>    chain.resume// ..now waiting on chain will blocked until
> >>    chain.resume finished(release sync on chain)
 chain.wait
> >>    return;
> >> 
> >> 
> >> following dump on console indicate the above sequence:
> >> 
> >> No DeadLock dump :
> >> --wait begin
> >> --notify all
> >> --wait end
> >> --api chain resume
> >> product service begin Fri Aug 19 12:10:28 CST 2011 //a lone time(10
> >> seconds) one way business logical begin
 product service end Fri Aug
> >> 19 12:10:38 CST 2011    .//a lone time(10 seconds) one way business
> >> logical end; 
> >> 
> >> DeadLock Dump:
> >> --wait begin
> >> --notify all
> >> --api chain resume
> >> product service begin Fri Aug 19 12:10:40 CST 2011
> >> product service end Fri Aug 19 12:10:50 CST 2011
> >> --wait end
> >> 
> >> 
> >> Until now I am not sure if  problem is CXF's or JDK's, or something
> >> which I don't  know cause such a deadlock;
 I also wrote a simple
> >> program to simulate the execute sequnce  which causeddead lock in
> >> CXF, but the simple program never dead lock; 
> >> I tried CXF 2.3.3 version && Jetty transport && (JDK1.5_22 || JDK
> >> 1.6_17) && Windows XP system;
 
> >> I also post this question as a JIRA issue:

-- 
Daniel Kulp
dk...@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Reply via email to