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

You added outhandler to global handlers chains, so it will be called on every 
service used inside this XFire instance. You can just add this handler to your 
service handlers chain, so it will be called only for this specific service.

> 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