activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Marbach (JIRA)" <jira+amq...@apache.org>
Subject [jira] [Commented] (AMQNET-405) Messages are not dequeued when using Two Phase Commit for DTC Transaction
Date Mon, 18 Feb 2013 06:55:13 GMT

    [ https://issues.apache.org/jira/browse/AMQNET-405?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13580461#comment-13580461
] 

Daniel Marbach commented on AMQNET-405:
---------------------------------------

See also patch provided in https://issues.apache.org/jira/browse/AMQNET-413 which also fixes
this problem
                
> Messages are not dequeued when using Two Phase Commit for DTC Transaction
> -------------------------------------------------------------------------
>
>                 Key: AMQNET-405
>                 URL: https://issues.apache.org/jira/browse/AMQNET-405
>             Project: ActiveMQ .Net
>          Issue Type: Bug
>          Components: ActiveMQ
>    Affects Versions: 1.5.6
>         Environment: Windows 7, AMQ 5.7
>            Reporter: Remo Gloor
>            Assignee: Jim Gomes
>
> Messages are not removed from the queue even though they are processes correctly in the
following scenaro:
> Create a NetTxConnection and NetTxSession. Create a consumer for some queue and register
the Listener event. Create a new TransactionScope in the event handler. Inside the consumer
you send a new message to some other queue using the session of the consumer. Do now some
action that uses the Distributed Transaction from another system (e.g. writing to a database)
to force that two phase commit is used instead of Single Phase Commit. Complete the and dispose
the TransactionScope.
> I'd expect that that the sent message is delivered to the queue, the database is modified
and the received message is removed from the input queue. But the behavior is that the last
expectation is not met. The message remains in the input queue.
> If you use an own session for sending the messages the problem does not occur. But this
has the disadvantage the you will always do two phase commits even if AMQ is the only system
that takes part in the Distrubuted Transaction.
> Code demonstrating the problem:
> namespace ConsoleApplication1
> {
>     using System;
>     using System.Transactions;
>     using Apache.NMS;
>     using Apache.NMS.ActiveMQ.Commands;
>     using Apache.NMS.Util;
>     class Program
>     {
>         private static INetTxSession activeMqSession;
>         private static IMessageConsumer consumer;
>         private static INetTxConnection connection;
>         static void Main(string[] args)
>         {
>             using (connection = CreateActiveMqConnection())
>             using (activeMqSession = connection.CreateNetTxSession())
>             using (consumer = activeMqSession.CreateConsumer(SessionUtil.GetQueue(activeMqSession,
"queue://foo.bar")))
>             {
>                 consumer.Listener += OnMessage;
>                 connection.Start();
>                 Console.WriteLine("Started");
>                 Console.WriteLine("Press any key to exit");
>                 Console.ReadKey();
>             }
>         }
>         private static INetTxConnection CreateActiveMqConnection()
>         {
>             var connectionFactory = new Apache.NMS.ActiveMQ.NetTxConnectionFactory("activemq:tcp://localhost:61616")
>                 {
>                     AcknowledgementMode = AcknowledgementMode.Transactional
>                 };
>             return connectionFactory.CreateNetTxConnection();
>         }
>         private static void OnMessage(IMessage message)
>         {
>             var x = new TestSinglePhaseCommit();
>             using (var session2 = connection.CreateNetTxSession())
>             using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew))
>             {
>                 Console.WriteLine("Message Received");
>                 // Force two phase commit, In reality this happens by using another system
that takes part in the 
>                 // distributed transaction like a database.
>                 Transaction.Current.EnlistDurable(Guid.NewGuid(), x, EnlistmentOptions.None);
>                 // The proble occurs only if a message is sent using the same session
like the receiver
>                 using (var producer = session2.CreateProducer(SessionUtil.GetQueue(session2,
"queue://foo.baz")))
>                 {
>                     producer.Send(new ActiveMQTextMessage("foo"));
>                 }
>                 tx.Complete();
>             }
>         }
>     }
>     internal class TestSinglePhaseCommit : ISinglePhaseNotification
>     {
>         public void Prepare(PreparingEnlistment preparingEnlistment)
>         {
>             preparingEnlistment.Prepared();
>         }
>         public void Commit(Enlistment enlistment)
>         {
>             enlistment.Done();
>         }
>         public void Rollback(Enlistment enlistment)
>         {
>             enlistment.Done();
>         }
>         public void InDoubt(Enlistment enlistment)
>         {
>             enlistment.Done();
>         }
>         public void SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment)
>         {
>             singlePhaseEnlistment.Committed();
>         }
>     }
> }

--
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

Mime
View raw message