Java 将JMSListener与RabbitMQ一起使用
我的应用程序目前使用IBM MQ,并且具有队列配置设置,可以很好地使用JMS。e、 gJava 将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,
@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容器工厂。