[ http://jira.codehaus.org/browse/XFIRE-747?page=comments#action_79692 ] 
            
PJ commented on XFIRE-747:
--------------------------

Thx. One more coffee and I figured it out myself ;-) Little inconvenience, but 
I can live with it...

I think that with your explanation this issue can be closed.

> Out handlers called twice
> -------------------------
>
>                 Key: XFIRE-747
>                 URL: http://jira.codehaus.org/browse/XFIRE-747
>             Project: XFire
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.2.2
>         Environment: Linux, JDK 1.5.0_06
>            Reporter: PJ
>         Assigned To: Dan Diephouse
>            Priority: Critical
>
> Out handlers are called twice if webservice method calls another webservice 
> via Client API.
> Service interface:
> @WebService
> public interface ITestService
> {
>       public void a();
>       
>       public void b();
> }
> Service implementation:
> @WebService (endpointInterface="test.ITestService")
> public class TestService implements ITestService
> {
>       public void a()
>       {
>               AnnotationServiceFactory factory = new 
> AnnotationServiceFactory();
>               Service service = factory.create(TestService.class);
>               
>               try
>               {
>                       ITestService test = (ITestService) new 
> XFireProxyFactory().create(service, 
> "http://localhost:8080/test/services/TestService";);
>                       
>                       test.b();       // while invoking b() out handler 
> pipeline is called, why???
>               }
>               catch (MalformedURLException e)
>               {
>                       e.printStackTrace();
>               }
>       }
>       
>       public void b()
>       {
>       }
> }
> Example in handler:
> public class TransactionBeginHandler extends AbstractHandler
> {
>       public void invoke(MessageContext context) throws Exception
>       {
>               Context ctx = new InitialContext();
>               UserTransaction ut = (UserTransaction) 
> ctx.lookup("java:comp/UserTransaction");
>               
>               ut.begin();
>       }
> }
> Example out handler:
> public class TransactionCommitHandler extends AbstractHandler
> {
>       public void invoke(MessageContext context) throws Exception
>       {
>               InitialContext ctx = new InitialContext();
>               UserTransaction ut = (UserTransaction) 
> ctx.lookup("java:comp/UserTransaction");
>               
>               ut.commit();
>       }
> }
> services.xml:
> <beans xmlns="http://xfire.codehaus.org/config/1.0";>
>       <xfire>
>               <inHandlers>
>                       <handler handlerClass="test.TransactionBeginHandler" />
>               </inHandlers>
>               <outHandlers>
>                       <handler handlerClass="test.TransactionCommitHandler" />
>               </outHandlers>
>       </xfire>
>       <service>
>               <serviceClass>test.TestService</serviceClass>
>               <serviceFactory>jsr181</serviceFactory>
>       </service>
> </beans>
> Test client:
> public class Test
> {
>       public static void main(String[] args) throws MalformedURLException
>       {
>               AnnotationServiceFactory factory = new 
> AnnotationServiceFactory();
>               Service service = factory.create(TestService.class);
>               ITestService test = (ITestService) new 
> XFireProxyFactory().create(service, 
> "http://localhost:8080/test/services/TestService";);
>               
>               test.a();
>       }
> }
> When test client calls method a() below sequence happens:
> 1. TransactionBeginHandler is executed on thread one (T1)
> 2. Method a() is executed on T1
>       2a. Another webservice is called from inside a() method, and for 
> unknown reason whole out handlers pipeline is invoked, so...
>       2b. TransactionCommitHandler is executed on T1
> 3. TransactionBeginHandler is executed on thread two (T2)
> 4. Method b() is executed on T2
> 5. TransactionCommitHandler is executed on T2
> 6. TransactionCommitHandler is executed on T1
> Exception occurs, because second execution of TransactionCommitHandler on T1 
> tries to commit already commited transaction. Besides, if after calling b() 
> some database operations occurs in method a() exception will be thrown 
> because there is no active transaction.
> In my test I've called another webservice on the same server (thus notation 
> of two threads, T1 handles a() invocation, T2 handles b() invocation), but it 
> doesn't matter - calling whatever webservice results in invoking handlers 
> pipeline.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to