i changed TransactionContext.getResourceManagerId to also append the
connections clientid

private String getResourceManagerId() throws JMSException {
        return this.connection.getResourceManagerId() + "/" +
this.connection.getClientID();
    }

therefor isSameRM() now only returns true for xaresources based on the same
amq-connection.

now everything works as expected, but don't know if this would be a valid
approach (or even the right place) to fix this :)

ty




On Sat, Apr 6, 2013 at 9:53 PM, Daniel Guggi <daniel.gu...@gmail.com> wrote:

> the jta spec says:
>
> 3.4.6 Resource Sharing
> When the same transactional resource is used to interleave multiple
> transactions, it is
> the responsibility of the application server to ensure that only one
> transaction is enlisted
> with the resource at any given time.
>
>
>
>
>
>
>
> On Sat, Apr 6, 2013 at 9:41 PM, Daniel Guggi <daniel.gu...@gmail.com>wrote:
>
>> glassfish code just does that:
>>
>> it know the following resources states (one TransactionContext per
>> connection - same xid,same branch => imo ok because
>> TransactionContext.isSameRM returns true)
>>
>>
>> TransactionContext{transactionId=XID[4871251,globalId=4000ffffffcaffffff98ffffffceffffffe064676e622c7365727665722c50313030,branchId=64676e622c7365727665722c503130302c0]}=0,
>>
>> TransactionContext{transactionId=XID:[4871251,globalId=4000ffffffcaffffff98ffffffceffffffe064676e622c7365727665722c50313030,branchId=64676e622c7365727665722c503130302c0]}=0
>>
>> on rollback glassfish just calls end(xid,flags) once per xaresource (the
>> xa resources above are equal i guess)
>>
>> on commit glassfish calls end(xid,flags) for every resource state
>> (transactioncontext)
>>
>> don't know if this is correct - i didn't find anything in the jta-specs...
>>
>> or maybe it is wrong to consider that two xa resources are equal for
>> different activemq-connections -> TransactionContext.isSameRM()
>>
>> daniel
>>
>>
>>
>> On Sat, Apr 6, 2013 at 8:48 PM, Daniel Guggi <daniel.gu...@gmail.com>wrote:
>>
>>> i forget to mention.
>>>
>>> when we do not throw an exception after the jms-template send everything
>>> works fine - transaction gets committed org.apache.activemq.
>>> TransactionContext.end(xid,flags) is called twice as expected...
>>>
>>>
>>>
>>>
>>> On Sat, Apr 6, 2013 at 8:46 PM, Daniel Guggi <daniel.gu...@gmail.com>wrote:
>>>
>>>> hi,
>>>>
>>>> we use spring's DMLC using an xa-pooledconnectionfactory
>>>>
>>>> when the DMLC receives a message the (test) message-lister just sends a
>>>> message to another queue using spring's jmstemplate. this jms-template also
>>>> uses a xa-pooledconnectionfactory (but another instance)
>>>>
>>>> that meas that we have two activemq xa-connections - one by the
>>>> listener and the other by the jms-template
>>>>
>>>> if the message-listener throws a runtime-exception after jmstemplate
>>>> send, the rollback is not properly performed.
>>>>
>>>> i can see that org.apache.activemq.TransactionContext.end(xid,flags) is
>>>> only called once for the dmlc-connection - so therefore no rollback is not
>>>> performed for the other xa-connection/session, which leads to a (jta)
>>>> system-exception on the next-message, because the pooldcf returns the
>>>> cached session
>>>>
>>>> any ideas how this could happen - this might be a jta issue? btw. we
>>>> are using glassfish-3.1.2.2
>>>>
>>>> thank you,
>>>> daniel
>>>>
>>>
>>>
>>
>

Reply via email to