2016-12-28 8 views
2

2つのスプリングブートアプリケーションがあります。レシーバ・アプリケーションのApplication.javaに私が持っている:両方のアプリケーションが組み込みのactivemqを使用する場合、1つのスプリングブートアプリケーションから別のスプリングブートアプリケーションにJmsメッセージを送信する方法

私は単純に使用し、送信側アプリケーションで
@Bean 
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    configurer.configure(factory, connectionFactory); 
    return factory; 
} 

とReceiver.java中...

@JmsListener(destination = "myQueue", containerFactory = "myFactory") 
public void receiveMessage(String tradeString) throws JSONException, IOException { 
    tradeImpl = new ObjectMapper().readValue(tradeString, TradeImpl.class); 
} 

public void send(trade) { 
    String queueName = "myQueue"; 
    String tradeString = new ObjectMapper().writeValueAsString(trade); 
    jmsTemplate.convertAndSend(queueName, tradeString); 
} 

だから私は」 receiver-applicationで指定されたキュー名にメッセージを送信するだけです。 私はログ

に次のように取得するにはJMXコネクタがURLにバインドできません起動に失敗しました[RMI:// localhostを:1099>/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi [ルート例外はjava.rmiであります.AlreadyBoundException:

私は、次の記事を読んでいると、それは非常に励みに見つけることができませんでした:

Spring boot - sharing embedded JMS broker with separate service

それはで締めくくら:

しかし、私が言及したように、私はこれが以前にはうまく動作せず、可能かどうかもわかりませんでした。 Springブートのドキュメントで、この組み合わせでは動作しないという明示的なメッセージが見つかりませんでした。

埋め込み型JMSブローカを外部に公開しないために、埋め込み型SpringブートJMSブローカの背後にあるアイデアは、メモリ内でのローカルテストのみを可能にすると考えられます。

私がしたいことが本当に可能なのか誰かが知っていますか?もしそうでなければ、埋め込まれたブローカーを使って春起動アプリケーションとの間のメッセージングをどのように達成できるかについての提案はありますか?

+1

2つの春起動アプリケーションとActiveMQが組み込まれている場合、これはAMQが2つの春のアプリケーションのいずれにも組み込まれていないことを意味しますか?なぜ外部スタンドアロンAMQを使用しないのですか? –

+0

私はできますが、私は最後の手段としてその方法を行くと思います!埋め込まれたルートを使ってアプリ同士のメッセージをやりとりする方法があるかどうかを知るために、私は本当に熱心な好奇心を持っています!私は確かにAMQと結婚していないので、私は他の組み込みソリューションにもオープンです。 –

答えて

2

あなたの2つの春のブートアプリは同じJVM上にある場合、あなたは単にに持っている唯一の1 2ののapplication.propertiesに追加します。

spring.activemq.broker-url=vm://localhost 

春ブーツもときのConnectionFactoryを構成することができますクラスパス上でActiveMQが利用可能であることを が検出します。ブローカが存在する場合、 (ブローカURLがコンフィグレーションによって指定されていない限り、 が指定されている限り)、埋め込みブローカが自動的に起動および設定されます。

あなたの2つの春のブートのアプリは、JVM 2つの貴様にある場合:POMで

:あなたが持っている必要がある1つのスプリングブートアプリで 。XML秒1で

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-activemq --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-activemq</artifactId> 
     <version>1.4.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jms</artifactId> 
    </dependency> 

:application.properties

spring.activemq.broker-url=tcp://localhost:61616 
のpom.xmlで

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jms</artifactId> 
</dependency> 
あなたは2 JVMがある場合を

、1のために

各アプリケーションは、デフォルトでは、春のブートは、最初のアプリケーションでは、このようなTCPコネクタを追加する必要がありますだけのVGAコネクタでAMQを構成します:

1

producerアプリケーションにはspring.activemq.brokerUrl=tcp://localhost:61616を指定してください。

この方法では、組み込みActiveMQブローカが無効になり、61616ポートで開始された別のポートへの接続が実行されます。

+0

追加されましたが、アプリケーションは次のように応答します。JMS処理中に未分類例外が発生しました。ネストされた例外はjavax.jms.JMSExceptionです:ブローカURL:tcp:// localhost:61616に接続できませんでした。理由:java.net.ConnectException:Connection refused "、 消費者のapplication.propertiesへの追加も必要ですか? –

+0

ええと、' broker.addConnector( "tcp:// localhost:61616")のように見えます。 ; –

+0

'VMTransportFactory'はlistenする' port'を公開しません。 –

関連する問題