[SPRING] 여러 장의 ActiveMQ 인스턴스를 구성하는 스프링 부트
SPRING여러 장의 ActiveMQ 인스턴스를 구성하는 스프링 부트
한 ActiveMQ 인스턴스의 큐에서 다른 ActiveMQ 인스턴스로 메시지를 이동해야한다는 요구 사항이 있습니다. 스프링 부트 구성을 사용하여 두 개의 다른 ActiveMQ 인스턴스에 연결할 수 있습니까?
여러 개의 connectionFactory를 만들어야합니까? 그렇다면 JmsTemplate은 연결할 ActiveMQ 인스턴스를 어떻게 알 수 있습니까?
@Bean
public ConnectionFactory connectionFactory() {
return new ActiveMQConnectionFactory(JMS_BROKER_URL);
}
도움과 코드 예제가 유용 할 것입니다.
미리 감사드립니다. GM
해결법
-
==============================
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.애플리케이션에서 여러 개의 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; ...
자세한 정보는 여기를 참조하십시오.
from https://stackoverflow.com/questions/43399072/spring-boot-configure-multiple-activemq-instances by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 혼합 된 다중 요청을 사용하는 @RequestPart, Spring MVC 3.2 (0) | 2019.03.16 |
---|---|
[SPRING] MTOM 첨부 파일이있는 Spring-WS 웹 서비스 - Hello world test (0) | 2019.03.16 |
[SPRING] Spring Security와 Struts2를 통합하는 방법 (0) | 2019.03.16 |
[SPRING] JSP 및 정적 리소스를 포함한 스프링 부팅 응용 프로그램 패키지 (0) | 2019.03.16 |
[SPRING] 시퀀스 "HIBERNATE_SEQUENCE"을 (를) 찾을 수 없습니다. SQL 문 (0) | 2019.03.16 |