2011/8/22 Daniel Kulp <dk...@apache.org>: > On Monday, August 22, 2011 10:26:36 AM Aki Yoshida wrote: >> Hi Dan, >> I was confused about the original intention of this wait(20) code. I >> didn't understand why it was important to wait 20msec and let the >> executor thread start instead of not waiting. The comment in the code >> says the intention is to try to keep the ordering of the messages from >> the client. But I had an impression that this code would not be >> helping in this matter. So I initially thought that we could just get >> rid of this wait to avoid the reported blocking situation. If keeping >> the ordering is important, shouldn't we introduce this mechanism >> optionally instead of trying to put this in there implicitly? > > Basically, if a client proxy sends a one-way request, and then immediately > follows it up with a two-way request, we were seeing (even in our unit tests) > where, in most situations, the two-way would get dispatched into the impl > before the one-way. While perfectly valid, this was kind of confusing to > users. Thus we added a very short wait there to make sure the runnable has > been started on a thread which usually allows it to proceed something closer > to in order. If the queue is full or all threads are busy, the wait will > timeout and the one-way will get there eventually, but in most cases this > works fairly well. > > Basically, it's a "best effort, but no guarantees". If they need to make sure > it's there in order, they would need two ways or use WS-RM.
Thanks for the explanation. I am sorry to hear that some people are not happy when a oneway call gets passed by a later invoked req-resp call. I personally think we could get rid of this wait(20) to make a oneway call more efficient. If someone wants to keep the invocation ordering of oneway and req-resp calls from a single client and while keeping it as it is and simple, could he also use the USE_ORIGINAL_THREAD option of this interceptor or was this option intended to be a workaround for the ordering problem? thanks. regards, aki > > Dan > > > >> >> Thanks. >> regards, aki >> >> 2011/8/19 Daniel Kulp <dk...@apache.org>: >> > 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; >> > >> > Thanks for the test case. There definitely is an issue here. At this >> > point, the thread has already synchronized on the chain (due to the >> > doIntercept method on the PhaseInterceptorChain being synchronized). >> > Thus, some of the synchronized blocks in there don't look correct. >> > If I create a simple: >> > >> > final Object lock = new Object(); >> > >> > in there, then that problem goes away. >> > >> > That said, I hit another couple of issues with your testcase as well >> > that I'm looking into. :-( >> > >> > Dan >> > >> >> ----- 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(WorkQueueManag >> >> >> er.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 > -- > Daniel Kulp > dk...@apache.org > http://dankulp.com/blog > Talend - http://www.talend.com >