No responses. Hmm.
I've done a *LOT* more detailed testing on this issue and found some interesting results when comparing various DMLC configurations on Websphere 8 and Weblogic 11g (10.3.5). I'm only focusing on concurrentConsumer configurations, since for my use case, I believe I need to have concurrentConsumers configured, unless referencing a CommonJ workmanager makes that need go away. I have certain DMLC instances that handle some very long message processing operations and I wouldn't want to block other requests from being serviced due to one very long request. All this testing was done with Spring 2.5.6.SEC03.
The configurations:
Common parts:
Code:
<bean id="messagingTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="com/test/mdp/workmanager" />
<property name="resourceRef" value="true" />
</bean>
<jee:jndi-lookup id="connectionFactory" jndi-name="java:comp/env/com/test/mdp/ConnectionFactory" />
<jee:jndi-lookup id="testQueue" jndi-name="java:comp/env/com/test/mdp/TestQueue" />
<bean id="textMessageListener" class="com.test.mdp.TestMessageListener" />
1. transactionless
Code:
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="taskExecutor" ref="messagingTaskExecutor" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="testQueue" />
<property name="messageListener" ref="textMessageListener" />
<property name="concurrentConsumers" value="2" />
</bean>
2. sessionTransacted
Code:
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="sessionTransacted" value="true" />
<property name="taskExecutor" ref="messagingTaskExecutor" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="testQueue" />
<property name="messageListener" ref="textMessageListener" />
<property name="concurrentConsumers" value="2" />
</bean>
3. JmsTransactionManager
Code:
<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="taskExecutor" ref="messagingTaskExecutor" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="testQueue" />
<property name="messageListener" ref="textMessageListener" />
<property name="concurrentConsumers" value="2" />
</bean>
4. JtaTransactionManager
Code:
<tx:jta-transaction-manager />
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="transactionManager" ref="transactionManager" />
<property name="taskExecutor" ref="messagingTaskExecutor" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="testQueue" />
<property name="messageListener" ref="textMessageListener" />
<property name="concurrentConsumers" value="2" />
</bean>
And the results
1. transactionless
Websphere 8 - No exceptions, but JMS connection resources are created and closed every time DMLC polls...constant PoolSize of 10.
Weblogic 10.3.5 - No exceptions, flat resource usage, shuts down cleanly.
2. sessionTransacted
Websphere 8 - Again, ConnectionFactory shows constant creation and destruction of resource, with garbage pool sizes (-3? WTF, Websphere thinks it's closed more than it's created). This is probably due to the following exceptions, which seem to happen randomly as DMLC polls, regardless of whether it's received a message or not...
Code:
[1/20/12 15:50:31:889 PST] 0000001f LocalTranCoor W WLTC0033W: Resource com/test/mdp/ConnectionFactory rolled back in cleanup of LocalTransactionContainment.
[1/20/12 15:50:31:889 PST] 00000025 LocalTransact E enlist(): It is NOT valid to continue working under a transaction that has already rolledback
[1/20/12 15:50:31:890 PST] 0000001f LocalTranCoor W WLTC0032W: One or more local transaction resources were rolled back during the cleanup of a LocalTransactionContainment.
[1/20/12 15:50:31:891 PST] 00000026 DefaultMessag 3 org.springframework.jms.listener.AbstractPollingMessageListenerContainer doReceiveAndExecute Consumer [com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl@1f5a9b7a] of session [com.ibm.ws.sib.api.jms.impl.JmsSessionImpl@1f5a9ae8] did not receive a message
[1/20/12 15:50:31:891 PST] 00000026 LocalTranCoor W WLTC0033W: Resource com/test/mdp/ConnectionFactory rolled back in cleanup of LocalTransactionContainment.
[1/20/12 15:50:31:891 PST] 0000001f LocalTransact E enlist(): It is NOT valid to continue working under a transaction that has already rolledback
[1/20/12 15:50:31:890 PST] 00000025 ConnectionEve E J2CA0074E: Unable to enlist connection from resource com/test/mdp/ConnectionFactory with current transaction in method localTransactionStarted due to exception. Initiating destruction of connection. Exception is: javax.resource.ResourceException: Attempt to continue working after transaction rolledback !
at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:577)
at com.ibm.ejs.j2c.ConnectionEventListener.localTransactionStarted(ConnectionEventListener.java:845)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaManagedConnection.localTransactionStarted(JmsJcaManagedConnection.java:929)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaSessionImpl.getCurrentTransaction(JmsJcaSessionImpl.java:323)
at com.ibm.ws.sib.api.jms.impl.JmsSessionImpl.getTransaction(JmsSessionImpl.java:1823)
at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl.receiveInboundMessage(JmsMsgConsumerImpl.java:1051)
at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl.receive(JmsMsgConsumerImpl.java:481)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:405)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:881)
at org.springframework.scheduling.commonj.DelegatingWork.run(DelegatingWork.java:61)
at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1178)
at com.ibm.ws.asynchbeans.WorkWithExecutionContextImpl.go(WorkWithExecutionContextImpl.java:199)
at com.ibm.ws.asynchbeans.CJWorkItemImpl.run(CJWorkItemImpl.java:236)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650)
[1/20/12 15:50:31:892 PST] 00000026 LocalTranCoor W WLTC0032W: One or more local transaction resources were rolled back during the cleanup of a LocalTransactionContainment.
[1/20/12 15:50:31:892 PST] 00000025 ConnectionEve W J2CA0206W: A connection error occurred. To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.
[1/20/12 15:50:31:892 PST] 0000001f ConnectionEve E J2CA0074E: Unable to enlist connection from resource com/test/mdp/ConnectionFactory with current transaction in method localTransactionStarted due to exception. Initiating destruction of connection. Exception is: javax.resource.ResourceException: Attempt to continue working after transaction rolledback !
at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:577)
at com.ibm.ejs.j2c.ConnectionEventListener.localTransactionStarted(ConnectionEventListener.java:845)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaManagedConnection.localTransactionStarted(JmsJcaManagedConnection.java:929)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaSessionImpl.getCurrentTransaction(JmsJcaSessionImpl.java:323)
at com.ibm.ws.sib.api.jms.impl.JmsSessionImpl.getTransaction(JmsSessionImpl.java:1823)
at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl.receiveInboundMessage(JmsMsgConsumerImpl.java:1051)
at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl.receive(JmsMsgConsumerImpl.java:481)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:405)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
...
see next post for continuation...