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