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

Justin Bertram commented on ARTEMIS-3526:
-----------------------------------------

You're seeing the expected behavior. 

An XA transaction that has been prepared but not committed is typically 
referred to as "in doubt". XA transactions that are in doubt are held by the 
broker until they can be recovered either by the original transaction manager 
(e.g. through some automated recovery process) or administratively via the 
management API. It's best for the original transaction manager to perform the 
recovery as it is able to communicate with _all_ the resource managers involved 
in the XA transaction and make the appropriate decision to either commit or 
rollback. That said, ActiveMQ Artemis provides a handful of management methods 
to deal with XA transactions in a "heuristic" way. These management methods are 
heuristic in that they are _unilateral_ decisions that affect the outcome of 
transactions. Heuristic administrative actions may break the atomicity of 
transactions if the administrative action differs from what was initially 
chosen by the original transaction manager.
* {{listPreparedTransactions()}} - List all the prepared transaction, sorted by 
date, oldest first
* {{listPreparedTransactionDetailsAsJSON()}} - List all the prepared 
transaction, sorted by date, oldest first, with details, in JSON format
* {{listPreparedTransactionDetailsAsHTML()}} - List all the prepared 
transaction, sorted by date, oldest first, with details, in HTML format
* {{listHeuristicComittedTransactions()}} - List transactions which have been 
heuristically committed
* {{listHeuristicRolledBackTransactions()}} - List transactions which have been 
heuristically rolled back
* {{commitPreparedTransaction(String)}} - Heuristically commits a prepared 
transaction.
* {{rollbackPreparedTransaction(String)}} - Heuristically rolls back a prepared 
transaction.

The broker even ships with an example demonstrating how these methods can be 
used. See {{examples/features/standard/xa-heuristic}}.

> Messages get stuck in delivering status on a queue.
> ---------------------------------------------------
>
>                 Key: ARTEMIS-3526
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-3526
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 2.18.0
>            Reporter: Jelmer
>            Priority: Major
>
> It seems that not "well behaved" consumers can cause messages to get stuck in 
> a delivering-status on a queue. It seems like the following can occur (sample 
> code follows):
> 1) Create a xa-connection/xa-session to an Artemis broker
> 2) Create a consumer on a queue on this Broker.
> 3) Start the "xa-transaction"
> 4) Consume a message
> 5) End the "xa-transaction"
> 6) Initiate a "xa-prepare" for the two-phase commit
> 7) DO NOT initiate a "xa-commit" (the consumer is not wel behaved or gets 
> killed half way through the process etc.).
>  
> In code (partial and based on the  XAReceiveExample from the Artemis-samples):
> {code:java}
> try (final XAConnection xaconnection = createXAConnection(xacf);
>     final XASession xaSession = createXASession(xaconnection)) {
>    final MessageConsumer consumer = xaSession.createConsumer(queue);
>    final Xid xid = createXid();
>    final XAResource xaRes = xaSession.getXAResource();
>    xaRes.start(xid, XAResource.TMNOFLAGS);
>    final Message message = consumer.receive(2000);
>    System.out.println("MESSAGE CONSUMED [" + message.getJMSMessageID() + "]");
>    xaRes.end(xid, XAResource.TMSUCCESS);
>    xaRes.prepare(xid);
>    //xaRes.commit(xid, false);
>    System.out.println("MESSAGE SORT OF COMMITTED [" + 
> message.getJMSMessageID() + "]");
> } {code}
>  
> After this the message seems to be stuck on the queue because it is still 
> being delivered to a consumer which is already gone. They show up in the 
> queue metrics but the actual message/content cannot be seen, queried, 
> consumed etc. We can see them using "artemis data exp" however.
>  
> We have the following questions:
> 1) Is there a way to get these messages out of this state, i..e. route them 
> to an expiry-queue after 24 hours or manualy ?
> 2) Is there (apart from "artemis data exp") a way to see the content ?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to