Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JMSListener与RabbitMQ一起使用_Java_Spring_Rabbitmq_Jms_Spring Jms - Fatal编程技术网

Java 将JMSListener与RabbitMQ一起使用

Java 将JMSListener与RabbitMQ一起使用,java,spring,rabbitmq,jms,spring-jms,Java,Spring,Rabbitmq,Jms,Spring Jms,我的应用程序目前使用IBM MQ,并且具有队列配置设置,可以很好地使用JMS。e、 g @EnableJms @Configuration public class IBMQueueConfig { @Bean("defaultContainer") public JmsListenerContainerFactory containerFactory(final ConnectionFactory connectionFactory,

我的应用程序目前使用IBM MQ,并且具有队列配置设置,可以很好地使用JMS。e、 g

@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 ConnectionFactory中布线?我知道如果我使用,这是可能的,但我想看看是否可以通过SpringRabbit依赖实现它

目的是避免专门为Rabbit MQ编写另一个
processMessage()
,并重复使用我已经拥有的

或者,我可以同时使用这两种注释吗?在这种情况下,我会使用spring配置文件来启用我需要的配置文件,具体取决于prod或test

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

如果要通过AMQP与RabbitMQ通话,必须使用
@RabbitListener
而不是
@JmsListener


如果要在生产中使用JMS,在测试中使用RabbitMQ,则可以同时添加这两种注释。

如果要通过AMQP与RabbitMQ对话,则必须使用
@RabbitListener
而不是
@JmsListener


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

您的意思是在同一方法上有
@RabbitListener
&&@JmsListener?我可以使用配置文件激活我需要的配置文件?是;我的意思是用两个注释注释相同的方法;只要生产类路径上没有SpringRabbit,它就会被忽略。但是,假设在生产中,您希望从JMS消费并生产到Rabbit,那么您需要在Rabbit容器工厂(或在
@RabbitListener
本身)和测试用例中设置
start()
它。这样,您可以在类路径上设置rabbit,但禁用侦听器。或者,是的,您可以使用概要文件来代替。因为该方法还使用
@JmsListener(destination=“${queue}”、concurrency=“${concurrency}”、containerFactory=“defaultContainer”进行注释
它查找
defaultContainer
bean,但由于
一个组件需要一个名为“defaultContainer”的bean,但找不到,因此失败。
应用了类级概要文件,使用local和prod.prod profile激活defaultContainer,在本例中,当我使用
local
启动应用程序时,它被取消了。您需要从测试类路径中删除spring jms,或者配置一个虚拟jms容器工厂,并将
AutoStart
设置为false。您的意思是在相同的方法中
@RabbitListener
&&
@JmsListener
?我可以使用配置文件激活我需要的配置文件?是;我的意思是用两个注释注释相同的方法;只要生产类路径上没有SpringRabbit,它就会被忽略。但是,假设在生产中,您希望从JMS消费并生产到Rabbit,那么您需要在Rabbit容器工厂(或在
@RabbitListener
本身)和测试用例中设置
start()
它。这样,您可以在类路径上设置rabbit,但禁用侦听器。或者,是的,您可以使用概要文件来代替。因为该方法还使用
@JmsListener(destination=“${queue}”、concurrency=“${concurrency}”、containerFactory=“defaultContainer”进行注释
它查找
defaultContainer
bean,但由于
一个组件需要一个名为“defaultContainer”的bean,但找不到,因此失败。
应用了类级概要文件,使用local和prod.prod profile激活defaultContainer,在本例中,当我使用
local
启动应用程序时,它被删除。您需要从测试类路径中删除spring jms,或者将
AutoStart
设置为false来配置虚拟jms容器工厂。