栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring Boot配置多个ActiveMQ实例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot配置多个ActiveMQ实例

除了@Chris的响应之外,您还必须使用不同的端口创建不同的BrokerService实例,并创建不同的ConnectionFactory以连接到每个代理,并使用这些不同的工厂向不同的代理发送消息,从而创建不同的JmsTemplate。

例如 :

import javax.jms.ConnectionFactory;import javax.jms.QueueConnectionFactory;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.broker.BrokerService;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jms.config.DefaultJmsListenerContainerFactory;import org.springframework.jms.config.JmsListenerContainerFactory;import org.springframework.jms.core.JmsTemplate;@Configurationpublic class ActiveMQConfigurationForJmsCamelRouteConsumeAndForward {    public static final String LOCAL_Q = "localQ";    public static final String REMOTE_Q = "remoteQ";    @Bean    public BrokerService broker() throws Exception {        final BrokerService broker = new BrokerService();        broker.addConnector("tcp://localhost:5671");        broker.setBrokerName("broker");        broker.setUseJmx(false);        return broker;    }    @Bean    public BrokerService broker2() throws Exception {        final BrokerService broker = new BrokerService();        broker.addConnector("tcp://localhost:5672");        broker.setBrokerName("broker2");        broker.setUseJmx(false);        return broker;    }    @Bean    @Primary    public ConnectionFactory jmsConnectionFactory() {        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:5671");        return connectionFactory;    }    @Bean    public QueueConnectionFactory jmsConnectionFactory2() {        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:5672");        return connectionFactory;    }    @Bean    @Primary    public JmsTemplate jmsTemplate() {        JmsTemplate jmsTemplate = new JmsTemplate();        jmsTemplate.setConnectionFactory(jmsConnectionFactory());        jmsTemplate.setDefaultDestinationName(LOCAL_Q);        return jmsTemplate;    }    @Bean    public JmsTemplate jmsTemplate2() {        JmsTemplate jmsTemplate = new JmsTemplate();        jmsTemplate.setConnectionFactory(jmsConnectionFactory2());        jmsTemplate.setDefaultDestinationName(REMOTE_Q);        return jmsTemplate;    }    @Bean    public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();        configurer.configure(factory, connectionFactory);        return factory;    }    @Bean    public JmsListenerContainerFactory<?> jmsListenerContainerFactory2( @Qualifier("jmsConnectionFactory2") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();        configurer.configure(factory, connectionFactory);        return factory;    }}

要将消息从一个AMQ实例移动到另一个实例,可以使用

JmsBridgeConnectors

请注意,通过下面的示例,您不能在要从其转发消息的队列上拥有多个使用者,因为Camel或JmsBridgeConnectors会使用该消息并进行转发。如果只希望转发邮件的副本,则可以采用以下解决方案:1-将队列转换为主题,通过持久订阅或追溯使用者来管理脱机使用者的邮件。2-将您的队列转换为复合队列,并使用DestinationsInterceptors将消息复制到另一个队列。3-将NetworkConnector用于经纪人网络

@Beanpublic BrokerService broker() throws Exception {    final BrokerService broker = new BrokerService();    broker.addConnector("tcp://localhost:5671");    SimpleJmsQueueConnector simpleJmsQueueConnector = new SimpleJmsQueueConnector();    OutboundQueueBridge bridge = new OutboundQueueBridge();    bridge.setLocalQueueName(LOCAL_Q);    bridge.setOutboundQueueName(REMOTE_Q);    OutboundQueueBridge[] outboundQueueBridges = new OutboundQueueBridge[] { bridge };    simpleJmsQueueConnector.getReconnectionPolicy().setMaxSendRetries(ReconnectionPolicy.INFINITE);    simpleJmsQueueConnector.setOutboundQueueBridges(outboundQueueBridges);    simpleJmsQueueConnector.setLocalQueueConnectionFactory((QueueConnectionFactory) jmsConnectionFactory());    simpleJmsQueueConnector.setOutboundQueueConnectionFactory(jmsConnectionFactory2());    JmsConnector[] jmsConnectors = new JmsConnector[] { simpleJmsQueueConnector };    broker.setJmsBridgeConnectors(jmsConnectors);    broker.setBrokerName("broker");    broker.setUseJmx(false);    return broker;}

或者使用如下的Camel:

@Beanpublic CamelContext camelContext() throws Exception {    CamelContext context = new DefaultCamelContext();    context.addComponent("inboundQueue", ActiveMQComponent.activeMQComponent("tcp://localhost:5671"));    context.addComponent("outboundQueue", ActiveMQComponent.activeMQComponent("tcp://localhost:5672"));    context.addRoutes(new RouteBuilder() {        public void configure() { from("inboundQueue:queue:" + LOCAL_Q).to("outboundQueue:queue:" + REMOTE_Q);        }    });    context.start();    return context;}

您的生产者必须像这样才能使用不同的JmsTemplates:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.CommandLineRunner;import org.springframework.jms.core.JmsTemplate;import org.springframework.stereotype.Component;@Componentpublic class Producer implements CommandLineRunner {    @Autowired    private JmsTemplate jmsTemplate;    @Autowired    @Qualifier("jmsTemplate2")    private JmsTemplate jmsTemplate2;    @Override    public void run(String... args) throws Exception {        send("Sample message");    }    public void send(String msg) {        this.jmsTemplate.convertAndSend(ActiveMQConfigurationForJmsCamelRouteConsumeAndForward.LOCAL_Q, msg);        this.jmsTemplate2.convertAndSend(ActiveMQConfigurationForJmsCamelRouteConsumeAndForward.REMOTE_Q, msg);    }}

和消费者:

import javax.jms.Session;import org.apache.activemq.ActiveMQSession;import org.springframework.jms.annotation.JmsListener;import org.springframework.stereotype.Component;@Componentpublic class Consumer {    @JmsListener(destination = ActiveMQConfigurationForJmsCamelRouteConsumeAndForward.REMOTE_Q, containerFactory = "jmsListenerContainerFactory2")    public void receiveQueue(Session session, String text) {        System.out.println(((ActiveMQSession) session).getConnection().getBrokerInfo());        System.out.println(text);    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号