JMS+SSM 整合IBM Mq发送/接收消息
近期开发要用到IBM WebSphere MQ,找了好多资料,竟然都是数年前或者数十年前的,把从资料里面路撸过来的内容肝成了一个Demo ,希望能给被IBM整绝望了的你一些帮助。
1.Maven坐标
<!--ibm队列-->
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.1.0.0</version>
</dependency>
<!--jms-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
2.队列相关配置文件
#ibmmq.properties
#主机地址-发送方
IMB.mq.mqHostUrl=192.168.230.129
#端口号
IMB.mq.mqPort=1414
#CCSID
IMB.mq.CCSID=1208
#队列管理器名称
IMB.mq.mqManager=MQ_LINUX
#连接通道
IMB.mq.mqChannel=CONN_CHANNEL
#队列名称
IMB.mq.mqName=QUEUE_RES
#缓存空间
IMB.mq.mqChannel.connectionFactory.sessionCacheSize=10
#是否重新连接
IMB.mq.reconnection=false
#账号信息
IMB.mq.userName=mqm
IMB.mq.password=root
3.发送方xml文件
//applicationContext-ibmmqSender.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描注解-->
<context:component-scan base-package="com.dean.demo.service"/>
<!--引入IbmMQ配置文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:ibmmq.properties</value>
</list>
</property>
<!--用于加载多个配置文件-->
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
<!--注解配置-->
<context:annotation-config />
<!-- WebSphere MQ Connection Factory -->
<bean id="ibmJmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="${IMB.mq.mqHostUrl}"/>
<property name="port" value="${IMB.mq.mqPort}"/>
<property name="CCSID" value="${IMB.mq.CCSID}"/>
<property name="queueManager" value="${IMB.mq.mqManager}"/>
<property name="channel" value="${IMB.mq.mqChannel}"/>
<property name="transportType" value="1"/>
</bean>
<!-- 创建连接 -->
<bean id="connectionFactoryAdapter" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="ibmJmsConnectionFactory"/>
<property name="username" value="${IMB.mq.userName}"/>
<property name="password" value="${IMB.mq.password}"/>
</bean>
<!-- JMS Queue Connection Factory -->
<bean id="ibmQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactoryAdapter"/>
<property name="sessionCacheSize" value="${IMB.mq.mqChannel.connectionFactory.sessionCacheSize}"/>
<property name="reconnectOnException" value="${IMB.mq.reconnection}"/>
</bean>
<bean id="ibmQueue" class="com.ibm.mq.jms.MQQueue">
<property name="baseQueueName" value="${IMB.mq.mqName}"/>
</bean>
<bean id="senderJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="ibmQueueConnectionFactory"/>
<property name="defaultDestination" ref="ibmQueue"/>
<property name="pubSubDomain" value="false"/>
</bean>
<bean id="ibmMessageSender" class="com.dean.demo.service.ibmmq.MessageSenderImpl">
</bean>
</beans>
4.发送方接口及实现类
// 发送方实接口
/**
* @author Dean
* @version 1.0
* @date 2020/05/06 23:23
*/
public interface MessageSender {
void sendMessage(String message);
}
// 发送方实现类
import com.dean.demo.service.MessageSender;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
/**
* @author Dean
* @version 1.0
* @date 2020/05/06 23:32
*/
@Component("ibmMessageSender")
public class MessageSenderImpl implements MessageSender {
@Resource(name="senderJmsTemplate")
private JmsTemplate jmsTemplate;
/**
* 这里用final是下面那个createTextMessage方法要求的
*/
@Override
public void sendMessage(final String message) {
this.jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
5.接收方xml文件
// applicationContext-ibmmqListener.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描注解-->
<context:component-scan base-package="com.dean.demo.service"/>
<!--引入IbmMQ配置文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:ibmmq.properties</value>
</list>
</property>
<!--用于加载多个配置文件-->
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
<!--注解配置-->
<context:annotation-config />
<!-- WebSphere MQ Connection Factory -->
<bean id="ibmJmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="${IMB.mq.mqHostUrl}"/>
<property name="port" value="${IMB.mq.mqPort}"/>
<property name="CCSID" value="${IMB.mq.CCSID}"/>
<property name="queueManager" value="${IMB.mq.mqManager}"/>
<property name="channel" value="${IMB.mq.mqChannel}"/>
<property name="transportType" value="1"/>
</bean>
<!-- 创建连接 -->
<bean id="connectionFactoryAdapter" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="ibmJmsConnectionFactory"/>
<property name="username" value="${IMB.mq.userName}"/>
<property name="password" value="${IMB.mq.password}"/>
</bean>
<!-- JMS Queue Connection Factory -->
<bean id="ibmQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactoryAdapter"/>
<property name="sessionCacheSize" value="${IMB.mq.mqChannel.connectionFactory.sessionCacheSize}"/>
<property name="reconnectOnException" value="${IMB.mq.reconnection}"/>
</bean>
<bean id="ibmQueue" class="com.ibm.mq.jms.MQQueue">
<property name="baseQueueName" value="${IMB.mq.mqName}"/>
</bean>
<bean id="queueContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="ibmQueueConnectionFactory" />
<property name="destination" ref="ibmQueue" />
<property name="pubSubDomain" value="false" />
<property name="concurrentConsumers" value="20" />
<property name="messageListener" ref="ibmTextMessageListener" />
</bean>
<bean id="ibmTextMessageListener" class="com.dean.demo.service.ibmmq.TextMessageListener">
</bean>
</beans>
6.接收方方法
// TextMessageListener
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* @author Dean
* @version 1.0
* @date 2020/05/06 23:48
*/
public class TextMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage msg = (TextMessage) message;
String msgStr = msg.getText();
System.out.println("队列收到的消息:" + msgStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.测试
从安装队列的Linux上看到的消息是这样的,难道出错了吗?其实并没有,具体原因还不清楚,如果有大神知道麻烦评论区帮忙解答一下,不胜感激!
其实使用监听类还是收到了正确的消息了的
8.总结
要不是公司要求,这玩意儿真的…太难搞了,看看就好,看看就好…感谢互联网,让这个老古董的用法还能流传下来!