如何从同一个应用程序向多个jms(活动mq)代理发送消息?

时间:2018-02-02 12:31:17

标签: java spring-boot jms activemq spring-jms

我在本地嵌入了2个具有嵌入式活动mq实例的应用程序(服务器)。

现在我需要为这些服务器创建一个客户端。

我已经阅读了asnswer:https://stackoverflow.com/a/43401330/2674303

并尝试重复此操作:

我注册了2个连接工厂:

@Bean
@Primary
public ConnectionFactory bitFinexExchangeJmsConnectionFactory() {
    return new ActiveMQConnectionFactory("tcp://localhost:61616");
}

@Bean
public ConnectionFactory hitbtcExchangeJmsConnectionFactory() {
    return new ActiveMQConnectionFactory("tcp://localhost:61617");
}

注册了2个jms模板:

@Bean
@Primary
public JmsTemplate bitfinexJmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(bitFinexExchangeJmsConnectionFactory());
    jmsTemplate.setDefaultDestinationName("robotCommand_bitfinex");
    return jmsTemplate;
}

@Bean
public JmsTemplate hitBtcJmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(hitbtcExchangeJmsConnectionFactory());
    jmsTemplate.setDefaultDestinationName("robotCommand_hitbtc");
    return jmsTemplate;
}

并在我的春季启动应用程序中编写了以下主要方法:

ConfigurableApplicationContext context = SpringApplication.run(RobotApplication.class, args);
JmsTemplate bitfinexJmsTemplate = context.getBean(JmsTemplate.class, "bitfinexJmsTemplate");
bitfinexJmsTemplate.convertAndSend("robotCommand", "message to bitfinex");

JmsTemplate hitBtcJmsTemplate = context.getBean(JmsTemplate.class, "hitBtcJmsTemplate");
hitBtcJmsTemplate.convertAndSend("robotCommand", "message to hitbtcc");

在客户端,我看到只发送了message to bitfinex

我开始调查问题,发现hitBtcJmsTemplate使用bitFinexExchangeJmsConnectionFactory。我试图改变我的主要方法代码:

ConfigurableApplicationContext context = SpringApplication.run(RobotApplication.class, args);
JmsTemplate bitfinexJmsTemplate = context.getBean(JmsTemplate.class, "bitfinexJmsTemplate");
bitfinexJmsTemplate.convertAndSend("robotCommand", "message to bitfinex");

JmsTemplate hitBtcJmsTemplate = context.getBean(JmsTemplate.class, "hitBtcJmsTemplate");
hitBtcJmsTemplate.setConnectionFactory((ConnectionFactory) context.getBean("hitbtcExchangeJmsConnectionFactory")); //  <---- additional line
hitBtcJmsTemplate.convertAndSend("robotCommand", "message to hitbtcc");

两个服务器都收到了消息。

因此很明显我的配置是错误的。请帮助纠正它。

2 个答案:

答案 0 :(得分:2)

你使用错误的getBean方法!!

<T> T getBean(java.lang.Class<T> requiredType,
              java.lang.Object... args)

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html#getBean-java.lang.Class-java.lang.Object...-

更改为

JmsTemplate bitfinexJmsTemplate = context.getBean("bitfinexJmsTemplate", JmsTemplate.class);

JmsTemplate hitBtcJmsTemplate = context.getBean("hitBtcJmsTemplate", JmsTemplate.class);

答案 1 :(得分:0)

您应指定@Qualifier。如果您使用@Autowired获取bean,那么您可以这样做

@Autowired
@Qualifier("hitBtcJmsTemplate")
JmsTemplate hitBtcJmsTemplate;

如果你想从ApplicationContext获取它,你必须使用BeanFactory。因为Beanfactory有一个指定限定符的方法。你可以这样做

BeanFactoryAnnotationUtils.qualifiedBeanOfType(applicationContext.getBeanFactory(), JmsTemplate.class, "hitBtcJmsTemplate");