Hi, Dan
Unfortunately,  the fixed for  CXF-3750 may cause another question. which I am 
not sure if it's a  issuem of CXF or things the user should take care;
Details I have comments in CXF-3750;

   

----- Original Message ----- 
From: "xuhb" <x...@tongtech.com>
To: <users@cxf.apache.org>
Sent: Monday, August 22, 2011 11:06 AM
Subject: Re: A mysteriously deadlock of CXF OnewayProcessorInterceptor


> Thanks Dan:
> 
> I tried, it's ok now; 
> thanks to your rapid fix;
> 
> ----- Original Message ----- 
> From: "Daniel Kulp" <dk...@apache.org>
> To: <users@cxf.apache.org>
> Cc: "xuhb" <x...@tongtech.com>
> Sent: Saturday, August 20, 2011 1:21 AM
> Subject: Re: A mysteriously deadlock of CXF OnewayProcessorInterceptor
> 
> 
>> 
>> 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