2017-04-13 8 views
3

1つのActiveMQインスタンスのキューから別のActiveMQインスタンスにメッセージを移動する必要があります。スプリングブート設定を使用して2つの異なるActiveMQインスタンスに接続する方法はありますか?spring boot複数のActiveMQインスタンスを設定する

複数のconnectionFactoriesを作成する必要がありますか?もしそうなら、JmsTemplateはどのActiveMQインスタンスに接続すべきかを知っていますか?

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

ヘルプとコード例は役に立ちます。

ありがとうございます。 GM

答えて

5

応答の追加 differentsポートを使用して異なるBrokerServiceインスタンスを作成し、それぞれのブローカに接続し、異なるブローカにメッセージを送信するためにこれらの異なるファクトリを使用して異なるJmsTemplateを作成するために異なるConnectionFactoryを作成する必要があります。例えば

:あなた以下の例でからのキューに複数のコンシューマを持つことができないという

注:JmsBridgeConnectorsを使用することができます別のインスタンスに1つのAMQインスタンスからメッセージを移動する

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

CamelまたはJmsBridgeConnectorsはメッセージを消費して転送するため、メッセージを転送します。唯一のメッセージのコピーを転送する場合は、いくつかの解決方法があります。 1キューをトピックに変換し、恒久サブスクリプションまたは遡及的コンシューマによってオフラインコンシューマのメッセージを管理します。 2キューを複合キューに変換し、DestinationsInterceptorsを使用してメッセージを別のキューにコピーします。あなたのプロデューサーは、貴様のJmsTemplatesを使用するには、このようにする必要があり

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

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); 
    } 
} 
Networkofブローカー

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

または下記のようにキャメルを使用して、ため 、3-使用NetworkConnector

および消費者:

+0

この詳細な回答をいただきありがとうございました。私はそれを働かせることができた。私はラクダのソリューションが好きです...それは素敵でシンプルです。ありがとうございました。 – user2279337

+0

@Hassen Bennour https://stackoverflow.com/questions/48582760/how-to-send-messages-to-multiple-active-mq-brokers-from-the-same-application私はあなたのソリューションの実装に問題があります – gstackoverflow

2

は、あなたのアプリケーションにBeansとして複数JmsTemplateのインスタンスをインスタンス化して、どこに行くべきJmsTemplateインスタンスを示すために、@Qualifier@Primary注釈の組み合わせを使用する必要があります。例えば

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

は、詳細はhereを参照してください。

+0

これは私に良いスタートを与えました。再度、感謝します。あなたのソリューションを拡張したhassen-bennourのサンプルコードも使用しました。 – user2279337

関連する問題