[
https://issues.apache.org/jira/browse/AMQNET-398?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrea Montemaggio updated AMQNET-398:
--------------------------------------
Attachment: Apache.NMS.WCF-NetTx.patch
Apache.NMS.ActiveMQ-NetTx.patch
> NetTx transaction support in WCF binding
> ----------------------------------------
>
> Key: AMQNET-398
> URL: https://issues.apache.org/jira/browse/AMQNET-398
> Project: ActiveMQ .Net
> Issue Type: Improvement
> Components: ActiveMQ, WCF
> Reporter: Andrea Montemaggio
> Assignee: Jim Gomes
> Priority: Minor
> Labels: transaction
> Attachments: Apache.NMS.ActiveMQ-NetTx.patch,
> Apache.NMS.WCF-NetTx.patch
>
>
> I needed to support ".NET style" distributed transactions with ActiveMQ
> broker and provided NMS WCF binding, but we can't get it working out of the
> box.
> Because of WCF binding lacks explicit support for this scenario, I tried to
> fool it by supplying a wrapper for INetTxConnectionFactory (and a related one
> for INetTxConnection) as an IConnectionFactory through nmsprovider-*.config
> file.
> Despite being able to make WCF binding to instantiate my wrapper class (and
> so, NetTxConnectionFactory under the hood), I needed to modify slightly WCF
> binding code in two points:
> - NmsOutputChannel: here I noticed that a premature session disposing due to
> the using block caused a deadlock when the ISession implementation was
> NetTxSession who waits for transaction to complete
> (TransactionContext.DtcWaitHandle.WaitOne() in Close() method). This
> phenomenon was not evident in the provided test code, because of the
> TransactionScope block is always INSIDE the using block that scopes the
> session. Using WCF binding is somewhat higher level, so I'm forced to wrap
> the WCF call with a TransactionScope.
> The modification I've made is to handle the non-transactional case like
> before, and to defer session disposing when inside a transaction (for this
> I've used provided events "TransactionCommittedListener" and
> "TransactionRolledBackListener").
> - NmsInputChannelListener: assuming a service method with
> OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete =
> true), my perception of the expected behavior when an exception is thrown in
> the service method is that the active transaction must be rolled back. Here
> we are on the receiving part (NMS WCF binding is below service code in the
> stack!) so
> to ensure this behavior (I stress this here: it's the expected behavior for
> me), I've had to provide a WCF custom IErrorHandler to raise an exception in
> HandleError method, that NMS WCF binding could be catch and rollback the
> active transaction.
> To obtain this, I've had to rethrow the exception in Dispatch method. I don't
> know if this cay cause troubles.
> Morover, I discovered a bug in ActiveMQ provider NetTxConnection.GuidFromId:
> the implementation does not cares that the hyphen is a valid character
> hostnames.
> I attach two patches here: one for the WCF binding component with the
> described changes, another for ActiveMQ provider with the transaction id
> translation fix and a minor one at a logging statement.
> Best Regards,
> Andrea Montemaggio
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira