How to send messages to multiple jms (active mq) brokers from the same application?

前提是你 提交于 2019-12-24 19:02:41

问题


I've up 2 applications(servers) with embedded active mq instances locally.

Now I need to create a client for this servers.

I've read the asnswer: https://stackoverflow.com/a/43401330/2674303

and try to repeat this:

I registered 2 connection factories:

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

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

registered 2 jms templates:

@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;
}

and wrote following main method in my spring boot application:

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");

In client I see that only message to bitfinex was delivered.

I started to investigate issue and found out that hitBtcJmsTemplate uses bitFinexExchangeJmsConnectionFactory. I tried to change my main method code:

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");

and both servers got the message.

Thus it is clear that my configuration is wrong. Please help to correct it.


回答1:


you use the wrong getBean method !!

<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...-

change to

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

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



回答2:


You should specify @Qualifier. If you are getting a bean using @Autowired, then you can do like this

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

If you want to get it from ApplicationContext, You have to use BeanFactory. because Beanfactory has a method to specify Qualifier. You can do like this

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


来源:https://stackoverflow.com/questions/48582760/how-to-send-messages-to-multiple-jms-active-mq-brokers-from-the-same-applicati

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!