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

Reply via email to