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 >>