使用 JmsListener 连接到 IBM MQ

Connect to IBM MQ using JmsListener

我有一个 Spring 应用程序,我想使用 JmsListener 连接到 IBM MQ。这是我的配置:

package com.in28minutes.example.layering.model;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter;

import javax.jms.ConnectionFactory;

@Configuration
@EnableJms
public class Qm1Config {

    @Bean
    public MQQueueConnectionFactory qm1ConnectionFactory() {
        MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
        try {
            cf.setHostName("localhost");
            cf.setPort(1414);
            cf.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
            cf.setQueueManager("QM1");
            cf.setChannel("DEV.ADMIN.SVRCONN");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cf;
    }

    @Bean
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(@Qualifier("qm1ConnectionFactory") ConnectionFactory connectionFactory) {
        UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
        userCredentialsConnectionFactoryAdapter.setUsername("admin");
        userCredentialsConnectionFactoryAdapter.setPassword("passw0rd");
        userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(connectionFactory);
        return userCredentialsConnectionFactoryAdapter;
    }

    @Bean
    public JmsListenerContainerFactory<?> qm1JmsListenerContainerFactory(@Qualifier("userCredentialsConnectionFactoryAdapter") UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(userCredentialsConnectionFactoryAdapter);
        return factory;
    }
}

这是我的消费者:

package com.in28minutes.example.layering.model;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class QueueConsumer {

    @JmsListener(destination = "DEV.QUEUE.1", containerFactory = "qm1JmsListenerContainerFactory")
    public void receive1(String text) {
        System.out.println("Received from qm1: " + text);
    }

}

我已经将应用程序部署到 TomEE plus 容器中,并且向队列发送了一些消息:

我还在 servlet 中添加了以下条目-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:beans=""
       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:annotation-config />
    <context:component-scan base-package="com.in28minutes.example.layering.model" />
</beans>

但是,应用程序没有使用这些消息。我该如何解决这个问题?

更新#1 我已经用 @EnableJMS

注释了消费者 class
@Component
@EnableJms
public class QueueConsumer {

    @JmsListener(destination = "DEV.QUEUE.1", containerFactory = "qm1JmsListenerContainerFactory")
    public void receive1(String text) {
        System.out.println("Received from qm1: " + text);
    }

}

我仍然没有收到消息

您可以尝试在 QueueConsumer class 上添加 @EnableJms 吗?