Hi Nikols, rynASync method do the same and create new transaction for service :)
Thanks & Regards -- Deepak Dixit HotWax Media Pvt. Ltd. www.hotwaxmedia.com Contact :- +91-98267-54548 Skype :- deepakdixit On Mar 23, 2013, at 3:05 AM, Nicolas Malin wrote: > I have a doubt to create a new transaction after the lasted have been set to > failed. > > If the Deppak's solution doesn't work, try to run serviceB by runASync. > > Nicolas > > Le 22/03/2013 19:36, Matthew Bertolini a écrit : >> Thanks Deepak. I will give that a shot. >> >> Matt Bertolini >> >> On 3/22/13 2:28 PM, "Deepak Dixit" <[email protected]> wrote: >> >>> Matt, >>> >>> In this case you can use requireNewTransaction for serviceB calling. >>> >>> Map serviceBResults = serviceBResults = dispatcher.runSync("serviceB", >>> data, <TransactionTimeOut> , true);// Use require new transaction true// >>> >>> >>> Thanks & Regards >>> -- >>> Deepak Dixit >>> HotWax Media Pvt. Ltd. >>> www.hotwaxmedia.com >>> Contact :- +91-98267-54548 >>> Skype :- deepakdixit >>> >>> On Mar 22, 2013, at 11:45 PM, Matthew Bertolini wrote: >>> >>>> Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure() >>>> methods are in use by my services. I neglected to copy them over to my >>>> example. But what about unexpected exceptions like RuntimeException or >>>> something that is thrown by the service engine itself. I don't have a >>>> choice to return failure like I do in my own code but I still want my >>>> serviceB to commit? >>>> >>>> Thanks, >>>> Matt Bertolini >>>> >>>> On 3/22/13 1:46 PM, "Deepak Dixit" <[email protected]> wrote: >>>> >>>>> Matt, >>>>> >>>>> As per you code if "doSomething" service return error then transaction >>>>> will be roll backed, as if service return error then transaction marked >>>>> as rollback hence it will rollback the transaction of parent service as >>>>> well. >>>>> >>>>> If doSomething fails to perform business logic then you can return >>>>> failure from service and then user ServiceUtil.isFailure() to check >>>>> failure and if this return true then you can run serviceB and return >>>>> error with errorMsg. >>>>> >>>>> So your code looks like this: >>>>> >>>>> {code} >>>>> try { >>>>> Map results = dispatcher.runSync("doSomething", data); // return >>>>> failure >>>>> if (ServiceUtil.isError(results)) { >>>>> // Service B requires a new transaction and should always >>>>> commit >>>>> regardless of outer transaction. >>>>> Map serviceBResults = dispatcher.runSync("serviceB", data); >>>>> return >>>>> ServiceUtil.returnError(ServiceUtil.getErrorMessage(results)) >>>>> } >>>>> } catch (GenericServiceException e) { >>>>> return ServiceUtil.returnError("message", e.getMessageList()); >>>>> } >>>>> {code} >>>>> >>>>> Or you can you use another syntax of runSync method for serviceB: >>>>> >>>>> {code} >>>>> try { >>>>> Map results = dispatcher.runSync("doSomething", data); >>>>> // Causes >>>>> error and initiates a rollback. >>>>> } catch (GenericServiceException e) { >>>>> // Service B requires a new transaction and should >>>>> always commit >>>>> regardless of outer transaction. >>>>> Map serviceBResults = dispatcher.runSync("serviceB", data, >>>>> 300, >>>>> true);// Use require new transaction true >>>>> return ServiceUtil.returnError("message", >>>>> e.getMessageList()); >>>>> } >>>>> {code} >>>>> >>>>> >>>>> Thanks & Regards >>>>> -- >>>>> Deepak Dixit >>>>> HotWax Media Pvt. Ltd. >>>>> www.hotwaxmedia.com >>>>> Contact :- +91-98267-54548 >>>>> Skype :- deepakdixit >>>>> >>>>> On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote: >>>>> >>>>>> Sorry for the delayed response. I was swamped with other things. I >>>>>> have >>>>>> created a simplified example to demonstrate my code: >>>>>> >>>>>> // Outer transaction begins in serviceA >>>>>> public static Map serviceA(DispatchContext dispatchContext, Map >>>>>> inputData) >>>>>> { >>>>>> GenericDelegator delegator = dispatchContext.getDelegator(); >>>>>> LocalDispatcher dispatcher = dispatchContext.getDispatcher(); >>>>>> >>>>>> // ... >>>>>> >>>>>> try { >>>>>> Map results = dispatcher.runSync("doSomething", data); // Causes >>>>>> error and initiates a rollback. >>>>>> } catch (GenericServiceException e) { >>>>>> // Service B requires a new transaction and should always commit >>>>>> regardless of outer transaction. >>>>>> Map serviceBResults = dispatcher.runSync("serviceB", data); >>>>>> return ServiceUtil.returnError("message", e.getMessageList()); >>>>>> } >>>>>> >>>>>> // ... >>>>>> >>>>>> return ServiceUtil.returnSuccess(successMessage); >>>>>> } >>>>>> >>>>>> >>>>>> I hope this helps illustrate the issue. >>>>>> >>>>>> Thanks >>>>>> Matt Bertolini >>>>>> >>>>>> On 3/14/13 11:01 AM, "Nicolas Malin" <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> Matt can you give me the serviceA code ? >>>>>>> >>>>>>> Nicolas >>>>>>> >>>>>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit : >>>>>>>> ServiceA has errored and therefore a rollback has been initiated >>>>>>>> before >>>>>>>> serviceB has been called but execution of serviceA has not yet >>>>>>>> completed. >>>>>>>> I am not sure what you mean by iterating. Also, I am working in pure >>>>>>>> java >>>>>>>> so any minilang solutions will not apply. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Matt Bertolini >>>>>>>> >>>>>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi Matt, >>>>>>>>> >>>>>>>>> If the service A has been rollbacked before call the serviceB ? >>>>>>>>> If you call serviceB on new transaction, the serviceA wait the >>>>>>>>> serviceB >>>>>>>>> return so this last has been commited. >>>>>>>>> >>>>>>>>> Warn with log if you work with a loop : >>>>>>>>> Service A : >>>>>>>>> <iterate ..> >>>>>>>>> <call-service name="serviceB"/> >>>>>>>>> </> >>>>>>>>> >>>>>>>>> Nicolas >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit : >>>>>>>>>> I have two service engine methods in Java. Lets call them serviceA >>>>>>>>>> and >>>>>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but >>>>>>>>>> serviceB >>>>>>>>>> requires a new transaction. The reason is I want serviceB to >>>>>>>>>> succeed >>>>>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging >>>>>>>>>> method). In this setup, I get the following message when serviceA >>>>>>>>>> errors: >>>>>>>>>> >>>>>>>>>> The current transaction is marked for rollback, not beginning a >>>>>>>>>> new >>>>>>>>>> transaction and aborting current operation; the rollbackOnly was >>>>>>>>>> caused >>>>>>>>>> by: Service [serviceA] Š >>>>>>>>>> >>>>>>>>>> Based on analysis of the database, I can see that serviceA did >>>>>>>>>> rollback >>>>>>>>>> as expected but serviceB didn't commit either. Not really sure how >>>>>>>>>> to >>>>>>>>>> fix this particular issue. Does "require-new-transaction" not >>>>>>>>>> really >>>>>>>>>> work as advertised? What am I missing? >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Matt Bertolini >>>>>>>>>> >>>>>>>>> -- >>>>>>>>> Nicolas MALIN >>>>>>>>> Consultant >>>>>>>>> Tél : 06.17.66.40.06 >>>>>>>>> Site projet : http://www.neogia.org/ >>>>>>>>> ------- >>>>>>>>> Société LibrenBerry >>>>>>>>> Tél : 02.48.02.56.12 >>>>>>>>> Site : http://www.librenberry.net/ >>>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Nicolas MALIN >>>>>>> Consultant >>>>>>> Tél : 06.17.66.40.06 >>>>>>> Site projet : http://www.neogia.org/ >>>>>>> ------- >>>>>>> Société LibrenBerry >>>>>>> Tél : 02.48.02.56.12 >>>>>>> Site : http://www.librenberry.net/ >>>>>>> > > > -- > Nicolas MALIN > Consultant > Tél : 06.17.66.40.06 > Site projet : http://www.neogia.org/ > ------- > Société LibrenBerry > Tél : 02.48.02.56.12 > Site : http://www.librenberry.net/ >
