You could just add methods to your interface to match up with other parts of 
the typical try/catch/finally blocks, such as:

void handleError(Throwable t);
void doFinally();

-David


On Apr 28, 2011, at 8:03 PM, Adrian Crum wrote:

> GenericEntityException is caught, the transaction is rolled back, and the 
> exception is re-thrown.
> 
> -Adrian
> 
> 
> On 4/28/2011 7:24 PM, Paul Foxworthy wrote:
>> Hi Adrian,
>> 
>> The key point of difference is catches. The rest, as you say, is boilerplate
>> stuff that can be encapsulated.
>> 
>> Client code could do whatever it wanted in catches, and if I'm reading you
>> right you're proposing encapsulating a standardized catch. That might not be
>> what the client wants under all circumstances.
>> 
>> Possible solutions are:
>> 
>> - No catch within runTransactionTask
>> - Standard catch within runTransactionTask, and rethrow the exception. I
>> assume the catch would log the error.
>> - Add an overloaded variant of runTransactionTask with a boolean parameter
>> to say whether or not the standard catch behaviour is wanted
>> - I did contemplate a system-wide property that can be configured to turn
>> the standard catch on or off by default, but I think that would be too
>> drastic, and client code should have the option case-by-case. I might be
>> wrong.
>> - Don't use runTransactionTask if the standard catch is not wanted
>> 
>> These are not all mutually exclusive!
>> 
>> Do you have standard catch behaviour in mind?
>> 
>> 
>> Adrian Crum-3 wrote:
>>> Setting up transactions properly can be complicated. I've seen cases
>>> where it was done wrong. Even when it's done right, it adds a lot of
>>> client code that gets repeated every time a transaction is used. I have
>>> an idea to make transaction handling easier and more reliable:
>>> 
>>> 1. Create an interface:
>>> 
>>> public interface TransactionTask {
>>>    void run() throws GenericEntityException;
>>> }
>>> 
>>> 2. Add a method to TransactionUtil.java:
>>> 
>>> public static void runTransactionTask(TransactionTask task, boolean
>>> suspendCurrent) throws GenericEntityException, GenericTransactionException
>>> {
>>> ...
>>> }
>>> 
>>> The TransactionUtil.runTransactionTask method will contain all of the
>>> correct begin, suspend, commit, resume, rollback, try, catch, finally
>>> logic. All the client code needs to do is put the transaction-protected
>>> code in a TransactionTask instance run() method and call the
>>> TransactionUtil.runTransactionTask method. Bottom line - less code,
>>> better results.
>>> 
>>> Example:
>>> 
>>> TransactionTask task = new TransactionTask() {
>>>      public void run() throws GenericEntityException {
>>>          GenericValue target = delegator...;
>>>          target.set("someField", "someValue");
>>>          target.store();
>>>      }
>>> };
>>> TransactionUtil.runTransactionTask(task, true);
>>> 
>>> 
>>> What do you think?
>>> 
>>> -Adrian
>>> 
>> 
>> --
>> View this message in context: 
>> http://ofbiz.135035.n4.nabble.com/Discussion-New-TransactionUtil-java-Methods-tp3473477p3482728.html
>> Sent from the OFBiz - Dev mailing list archive at Nabble.com.

Reply via email to