Spring整合IBMMq:JMS+SSM 整合IBM Mq发送/接收消息-Demo

1 篇文章 0 订阅
1 篇文章 0 订阅

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虚拟机上收到的消息从安装队列的Linux上看到的消息是这样的,难道出错了吗?其实并没有,具体原因还不清楚,如果有大神知道麻烦评论区帮忙解答一下,不胜感激!

其实使用监听类还是收到了正确的消息了的

在这里插入图片描述

8.总结

要不是公司要求,这玩意儿真的…太难搞了,看看就好,看看就好…感谢互联网,让这个老古董的用法还能流传下来!

大功告成,欢迎补充
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,可以使用Spring Boot的JMS支持来整合IBMMQ,并通过配置多个连接工厂来监听多个服务器的消息。具体步骤如下: 1. 在pom.xml文件中添加如下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> ``` 2. 配置IBMMQ连接工厂 在application.properties文件中添加如下配置: ``` spring.jms.pub-sub-domain=true spring.jms.listener.auto-startup=true spring.jms.listener.concurrency=1 spring.jms.listener.max-concurrency=10 # 第一个IBMMQ连接工厂配置 spring.jms.ibm.mq.queue-manager=QM1 spring.jms.ibm.mq.channel=CHANNEL1 spring.jms.ibm.mq.conn-name=host1(1414) # 第二个IBMMQ连接工厂配置 spring.jms.ibm.mq.queue-manager=QM2 spring.jms.ibm.mq.channel=CHANNEL2 spring.jms.ibm.mq.conn-name=host2(1414) ``` 其中,spring.jms.ibm.mq.*为IBMMQ连接工厂的配置项,可根据实际情况进行修改。 3. 监听IBMMQ消息 通过在Spring Boot中配置JMS监听器来监听IBMMQ消息。可以使用@JmsListener注解来指定监听的队列名称。 ``` @Component public class IBMMQListener { @JmsListener(destination = "QUEUE1") public void onMessage1(Message message) { // 处理消息 } @JmsListener(destination = "QUEUE2") public void onMessage2(Message message) { // 处理消息 } } ``` 其中,@JmsListener注解中的destination属性为队列名称,可以根据实际情况进行修改。 通过以上步骤,即可实现Spring Boot整合IBMMQ,同时监听多个服务器消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值