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