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/