복붙노트

[SPRING] 여러 장의 ActiveMQ 인스턴스를 구성하는 스프링 부트

SPRING

여러 장의 ActiveMQ 인스턴스를 구성하는 스프링 부트

한 ActiveMQ 인스턴스의 큐에서 다른 ActiveMQ 인스턴스로 메시지를 이동해야한다는 요구 사항이 있습니다. 스프링 부트 구성을 사용하여 두 개의 다른 ActiveMQ 인스턴스에 연결할 수 있습니까?

여러 개의 connectionFactory를 만들어야합니까? 그렇다면 JmsTemplate은 연결할 ActiveMQ 인스턴스를 어떻게 알 수 있습니까?

  @Bean
    public ConnectionFactory connectionFactory() {
        return new ActiveMQConnectionFactory(JMS_BROKER_URL);
    }

도움과 코드 예제가 유용 할 것입니다.

미리 감사드립니다. GM

해결법

  1. ==============================

    1.@Chris의 응답에 덧붙여 differents 포트를 사용하여 다른 BrokerService 인스턴스를 생성하고 각 브로커에 연결하고 이러한 다른 팩토리를 사용하여 다른 브로커에 메시지를 전송하는 다른 JmsTemplate을 작성하는 다른 ConnectionFactory를 작성해야합니다.

    @Chris의 응답에 덧붙여 differents 포트를 사용하여 다른 BrokerService 인스턴스를 생성하고 각 브로커에 연결하고 이러한 다른 팩토리를 사용하여 다른 브로커에 메시지를 전송하는 다른 JmsTemplate을 작성하는 다른 ConnectionFactory를 작성해야합니다.

    예 :

    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;
    
    @Configuration
    public 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 - Networkof 브로커 용 NetworkConnector 사용

    @Bean
    public 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을 사용합니다.

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

    differents 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;
    
    @Component
    public 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;
    
    @Component
    public 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);
        }
    }
    
  2. ==============================

    2.애플리케이션에서 여러 개의 JmsTemplate 인스턴스를 Bean으로 인스턴스화 한 다음 @Qualifier와 @Primary 주석을 결합하여 어느 JmsTemplate 인스턴스가 어디로 가야하는지 지정해야한다.

    애플리케이션에서 여러 개의 JmsTemplate 인스턴스를 Bean으로 인스턴스화 한 다음 @Qualifier와 @Primary 주석을 결합하여 어느 JmsTemplate 인스턴스가 어디로 가야하는지 지정해야한다.

    예를 들어

    @Bean("queue1")
    @Primary
    public JmsTemplate getQueue1(@Qualifier("connectionFactory1")ConnectionFactory factory...){
    ...
    }
    
    @Bean("queue2")
    @Primary
    public JmsTemplate getQueue2(@Qualifier("connectionFactory2")ConnectionFactory factory...){
    ...
    }
    
    ...
    
    @Autowired
    @Qualifier("queue1")
    private JmsTemplate queue1;
    ...
    

    자세한 정보는 여기를 참조하십시오.

  3. from https://stackoverflow.com/questions/43399072/spring-boot-configure-multiple-activemq-instances by cc-by-sa and MIT license