将JMSListener与RabbitMQ一起使用

问题描述 投票:1回答:1

我的应用程序当前使用IBM MQ,并且具有队列配置设置,并且可以与JMS正常工作。例如

@EnableJms
@Configuration
public class IBMQueueConfig {

    @Bean("defaultContainer")
    public JmsListenerContainerFactory containerFactory(final ConnectionFactory connectionFactory,
                                                        final ErrorHandler errorHandler) {
        final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
}

我可以收到如下消息并进行处理:

@Service
public class ProcessMessageReceive {

    @JmsListener(destination = "${queue}", concurrency = "${threads}", containerFactory = "defaultContainer")
    public Message processMessage(@Payload final String message) {
        //do stuff
    }
}

我需要使用RabbitMQ进行测试,并需要其他配置。我有以下课程:

@Configuration
@ConfigurationProperties(prefix = "spring.rabbitmq")
@EnableRabbit
public class RabbitMQConfiguration {

    private String host;
    private int port;
    private String username;
    private String password;
    private String virtualHost;


    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(exchange);
    }


    @Bean("defaultContainer")
    public JmsListenerContainerFactory containerFactory(@Qualifier("rabbit-connection-factory") final ConnectionFactory connectionFactory) {
        final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(); //ERROR
        return factory;
    }


    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(@Qualifier("rabbit-connection-factory") final ConnectionFactory connectionFactory,
                                                                               @Value("spring.rabbitmq.listener.simple.concurrency") final int concurrency,
                                                                               @Value("spring.rabbitmq.listener.simple.max-concurrency") final int maxConcurrency) {
        final SimpleRabbitListenerContainerFactory containerFactory = new SimpleRabbitListenerContainerFactory();
        containerFactory.setConnectionFactory(connectionFactory);
        containerFactory.setConcurrentConsumers(concurrency);
        containerFactory.setMaxConcurrentConsumers(maxConcurrency);
        containerFactory.setDefaultRequeueRejected(false);

        return containerFactory;
    }

    @Bean(name = "rabbit-connection-factory")
    public ConnectionFactory connectionFactory() {
        final CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);
        return connectionFactory;
    }

    @Bean
    public Queue inboundQueue() {
        return new Queue(fixInboundQueue, true);
    }

    @Bean
    public Binding inboundQueueBinding() {
        return bind(inboundQueue())
                .to(exchange())
                .with(routingKey);
    }
}

我在factory.setConnectionFactory(connectionFactory);行收到错误,因为它期望的是javax.jms.ConnectionFactory,但提供的是Rabbit MQ One。

有没有一种方法可以连接Rabbit MQ ConnectionFactory?我知道是否可以使用RMQConnectionFactory,但是我正在寻找是否可以通过Spring Rabbit依赖关系来实现。

目的是避免专门为Rabbit MQ写另一个RMQConnectionFactory,并重用我已有的东西。

或者,我可以同时使用两个注释吗?在哪种情况下,我会根据生产或测试使用弹簧轮廓来启用所需的弹簧轮廓?

processMessage()
java spring rabbitmq jms spring-jms
1个回答
0
投票

如果要通过AMQP与RabbitMQ通话,则必须使用 @RabbitListener(queues = "${app.rabbitmq.queue}") @JmsListener(destination = "${queue}", concurrency = "${threads}", containerFactory = "defaultContainer") public Message processMessage(@Payload final String message) { //do stuff } 而不是@RabbitListener。>

如果要在生产中使用JMS,而在测试中使用RabbitMQ,则可以添加两个注释。

© www.soinside.com 2019 - 2024. All rights reserved.