All works as I need with Spring programmatic transaction demarcation in
separate thread.
context.xml:
<beans>
<bean id="broker" class="org.apache.activemq.broker.BrokerService"
init-method="start" destroy-method="stop">
<property name="persistent" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://localhost:5000</value>
</list>
</property>
</bean>
<bean id="jotm"
class="org.springframework.transaction.jta.JotmFactoryBean"/>
<bean id="jotmTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm"/>
</bean>
<bean id="jotmTransactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager"
ref="jotmTransactionManager"/>
</bean>
<bean id="jmsConnectionFactory"
class="org.jencks.pool.PooledSpringXAConnectionFactory">
<property name="connectionFactory">
<bean
class="org.apache.activemq.ActiveMQXAConnectionFactory">
<property name="brokerURL"
value="tcp://localhost:5000" />
</bean>
</property>
<property name="transactionManager" ref="jotm"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="defaultDestinationName" value="messages.input"/>
</bean>
<bean id="messageReceiver" class="simple.MessageReceiver"
init-method="receive">
<property name="transactionTemplate"
ref="jotmTransactionTemplate"/>
<property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
</beans>
MessageReceiver.java:
public class MessageReceiver {
private Log log = LogFactory.getLog(getClass());
private JmsTemplate jmsTemplate;
private TransactionTemplate transactionTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void setTransactionTemplate(TransactionTemplate
transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
public void receive() {
Thread readerThread = new Thread(new Runnable(){
public void run() {
while(!Thread.currentThread().isInterrupted()) {
transactionTemplate.execute(
new TransactionCallbackWithoutResult() {
public void
doInTransactionWithoutResult(TransactionStatus status) {
Message message =
jmsTemplate.receive();
log.debug(message);
}
}
);
}
}
});
readerThread.start();
}
}
On starting and sending message to queue://messages.input I see:
INFO BrokerService - ActiveMQ null JMS Message Broker (localhost) is
starting
INFO BrokerService - For help or more information please see:
http://incubator.apache.org/activemq/
INFO TransportServerThreadSupport - Listening for connections at:
tcp://prokopiev.stc.donpac.ru:5000
INFO TransportConnector - Connector tcp://prokopiev.stc.donpac.ru:5000
Started
INFO BrokerService - ActiveMQ JMS Message Broker (localhost,
ID:prokopiev.stc.donpac.ru-42291-1156317141577-0:0) started
INFO jotm - JOTM started with a local transaction factory which is not
bound.
INFO jotm - CAROL initialization
INFO ConfigurationRepository - No protocols were defined for property
'carol.protocols', trying with default protocol = 'jrmp'.
INFO jta - JOTM 2.0.10
INFO JtaTransactionManager - Using JTA UserTransaction:
[EMAIL PROTECTED]
INFO JtaTransactionManager - Using JTA TransactionManager:
[EMAIL PROTECTED]
INFO ManagementContext - JMX consoles can connect to
service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
DEBUG PooledSpringXAConnection - -->> ENTERING
PooledSpringXAConnection.createXASession()
DEBUG PooledSpringXAConnection - -->> ACTUAL TRANSACTION IS ACTIVE!
DEBUG PooledSpringXAConnection - -->> NO ACTIVE SESSION ASSOCIATED WITH
CURRENT THREAD, BORROWING...
DEBUG XASessionPool - ---->>>>> BORROWING JMS SESSION FROM POOL...
DEBUG XASessionPool - ---->>>>> CREATING NEW SESSION TO SATISFY REQUEST!!
DEBUG XASessionPool - ---->>>>> BORROWED SESSION:
[EMAIL PROTECTED]
DEBUG PooledSpringXAConnection - -->> ENLISTING NEW SESSION'S XAResource
WITH TRANSACTION...
DEBUG PooledSpringXAConnection - -->> BINDING NEW SESSION WITH
TRANSACTION...
DEBUG PooledSpringXAConnection - -->> REGISTERING SYNCHRONIZATION WITH
TRANSACTION...
DEBUG PooledSpringXASession - ---->>>>> PooledSpringXASession.close() called
DEBUG PooledSpringXASession - ---->>>>> ignoreClose IS TRUE! KEEPING
SESSION OPEN!
DEBUG MessageReceiver - ActiveMQObjectMessage {commandId = 5,
responseRequired = true, messageId =
ID:prokopiev.stc.donpac.ru-42299-1156317149577-0:0:1:1:1,
originalDestination = null, originalTransactionId = null, producerId =
ID:prokopiev.stc.donpac.ru-42299-1156317149577-0:0:1:1, destination =
queue://messages.input, transactionId = null, expiration = 0, timestamp
= 1156317150047, arrival = 0, correlationId = null, replyTo = null,
persistent = true, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false, userID =
null, content = [EMAIL PROTECTED],
marshalledProperties = null, dataStructure = null, redeliveryCounter =
0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody
= true}
DEBUG PooledSpringXAConnection - -->>
PooledSpringXAConnection.[synchronization].afterCompletion() CALLED...
DEBUG PooledSpringXAConnection - -->> RETURNING JMS SESSION TO POOL...
DEBUG PooledSpringXASession - ---->>>>> PooledSpringXASession.close() called
DEBUG PooledSpringXASession - ---->>>>> ignoreClose = false, so
returning session pool...
DEBUG XASessionPool - ---->>>>> SESSION HAS BEEN RETURNED TO POOL:
[EMAIL PROTECTED]
DEBUG PooledSpringXAConnection - -->> ENTERING
PooledSpringXAConnection.createXASession()
DEBUG PooledSpringXAConnection - -->> ACTUAL TRANSACTION IS ACTIVE!
DEBUG PooledSpringXAConnection - -->> NO ACTIVE SESSION ASSOCIATED WITH
CURRENT THREAD, BORROWING...
DEBUG XASessionPool - ---->>>>> BORROWING JMS SESSION FROM POOL...
DEBUG XASessionPool - ---->>>>> BORROWED SESSION:
[EMAIL PROTECTED]
DEBUG PooledSpringXAConnection - -->> ENLISTING NEW SESSION'S XAResource
WITH TRANSACTION...
DEBUG PooledSpringXAConnection - -->> BINDING NEW SESSION WITH
TRANSACTION...
DEBUG PooledSpringXAConnection - -->> REGISTERING SYNCHRONIZATION WITH
TRANSACTION...
INFO jotm - set rollback only (tx=bb14:38:0:0148841f24dbed9394...eebc02:)
I confused by last message but transaction is commited as I see to
queue://messages.input - this queue is empty after reading message from it
--
Thanks,
Eugene Prokopiev