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.class)
>> .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:
>>

Reply via email to