How to solve the JBOSS server jms transaction failure problem

The way to replace the JMS queue connection factory from JNDI to Spring bean

The jar package version involving MQ needs to be 7.0.1.0 or higher to support reconnection. Maven has the latest jar7.0.1.12 version.
dhbcore-7.0.1.12.jar
jmqi-7.0.1.12.jar
mqjms-7.0.1.12.jar

<dependency>
    <groupId>com.ibm.mqjms</groupId>
    <artifactId>mqjms</artifactId>
    <version>7.0.1.12</version>
</dependency>
<dependency>
    <groupId>com.ibm.mq.jmqi</groupId>
    <artifactId>jmqi</artifactId>
    <version>7.0.1.12</version>
</dependency>
<dependency>
    <groupId>com.ibm.mq.dhbcore</groupId>
    <artifactId>dhbcore</artifactId>
    <version>7.0.1.12</version>
</dependency>






Step 1: Add the following configuration to the spring configuration file

The configuration of the connection factory is as follows:
<bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="queueManager" value="SOA_QM"></property>
    <property name="connectionNameList" value="192.168.0.101(2001),192.168.0.102(2001)"></property>
    <property name="clientReconnectOptions" value="16777216"></property>
<property name="clientReconnectTimeout" value="100"></property>
    	<property name="channel" value="CHANNELTEST"></property>
    	<property name="transportType" value="1"></property>
    <property name="CCSID" value="1208"></property>
</bean>
<!--
Note: The parts marked in red are the configuration properties when there are active and standby machines
-->

<!--
The queue configuration is as follows:
-->
<bean id="receiveQueue" class="com.ibm.mq.jms.MQQueue">
    <property name="baseQueueName" value="TestReceiveQueue"></property>
    <property name="CCSID" value="1208"></property>
</bean>

<bean id="sendQueue" class="com.ibm.mq.jms.MQQueue">
    <property name="baseQueueName" value="TestSendQueue"></property>
    <property name="CCSID" value="1208"></property>
</bean>

<!--
Note: It is configured in this way regardless of production or consumption. If the connection factory or queue of production and consumption is the same, it only needs to be configured once.
-->




// Use native springJms-like arrangement
//Define a class that implements the javax.jms.MessageListener interface
public class TestListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
         // specific business logic
        	System.out.println(message);    }
}









<!-Used native springJms-like arrangement->
<!--Same as non-transactional standard consumers, change the following parts: -->
<bean id="testContainer"
      class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="concurrentConsumers" value="1" />
    <property name="maxConcurrentConsumers" value="2" />
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="destination" ref="receiveQueue" />
    <property name="messageListener" ref="testListener" />
    <property name="sessionTransacted" value="true"></property>
</bean>

connectionFactory: queue connection factory
destination: queue
messageListener: the listener corresponding to the queue
sessionTransacted: Whether to enable JMS transactions



Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326655460&siteId=291194637