[wildfly-dev] CMT Batch Puzzle (Was Re: [Transaction synchronization between threads])

James R. Perkins jperkins at redhat.com
Tue Feb 4 17:40:02 EST 2014


Ignore me, I think I misunderstood what the issue was. I was thinking a 
long the lines of the job repository. Cheng explained it well here FWIW 
https://java.net/projects/jbatch/lists/public/archive/2014-02/message/1.

The RI doesn't appear to do any kind of suspend/resume of transactions. 
It just has it's own interface it uses and decides at runtime whether 
it's SE using non-JTA or grabs it from JNDI on the container for EE.

On 02/04/2014 02:10 PM, James R. Perkins wrote:
>
> On 02/04/2014 01:31 PM, Jason Greene wrote:
>> On Feb 4, 2014, at 1:42 PM, James R. Perkins <jperkins at redhat.com> 
>> wrote:
>>
>>> I don't see in the spec where it requires any kind of transaction 
>>> around a job repository. In fact the spec states "Note the 
>>> implementation of the job repository is outside the scope of this 
>>> specification.".
>>>
>>> The RI does have a JDBC repository, but it doesn't insert anything 
>>> into the tables in a transaction.
>>>
>>> If we're only seeing this in PostgreSQL and a workaround with 
>>> putting JobOperator.start() outside a transaction works, I would 
>>> suggest that's okay for now. I do agree it needs to be fixed, but we 
>>> might want to look at how we're handling transaction in JBeret as a 
>>> whole. The RI, not that I want to model anything after it, uses it's 
>>> own TransactionManagerAdapter. It might make sense for JBeret to use 
>>> a TransactionManager rather than a UserTransaction. Or put the 
>>> ownness on the SPI implementation of the BatchEnvironment to handle 
>>> the transactions.
>> Good points; and this brings me to my pathological batch puzzle. What 
>> does this code do:
>>
>> // Default gets transaction required
>> String doStuff() {
>>      long execID = jobOperator.start("simplejob", props);
>>      BatchStatus status = 
>> jobOperator.getJobExecution(execID).getBatchStatus()
>>      while (status != COMMITTED && status != FAILED && status != 
>> ABANDONED) {
>>          Thread.sleep(1000);
>>      }
>>      return status.toString();
>> }
> Cheng will probably be better at answering as I'm still learning the 
> spec better, but in general it will depend on what's defined in your 
> simplejob.xml. For a JDBC repository it will perform an DB operations 
> in a UserTransaction retrieved from the 
> org.jboss.as.txn.service.TxnServices. This is the same UT that would 
> be used for any transactions required in the batch job as well.
>
> For a in-memory repository, not transaction is used when updating the 
> repository.
>
> Now what really happens with that code though is if it reaches one of 
> those states fast enough you'll have an endless loop :P
>>
>> -- 
>> Jason T. Greene
>> WildFly Lead / JBoss EAP Platform Architect
>> JBoss, a division of Red Hat
>>
>

-- 
James R. Perkins
Red Hat JBoss Middleware



More information about the wildfly-dev mailing list