2016-09-02 30 views
4

インターネットをあちこち揺らしてしまったあと、WildFly 10でActiveMQ(Artemis)を使用してJMSを使用してリモートメッセージキューにプッシュするサンプル構成を見つけることができません)。状況を悪化させるためには、here on GitHubのXSDを見つけたときには、各ノード/属性が何を意味し、どの値を何に入れることができるかを示すドキュメントは含まれていません。WildFly 10からリモートActiveMQへのJMSメッセージの送信方法

以下は、standalone-full.xmlの元の設定です。

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> 
     <server name="default"> 
     <security-setting name="#"> 
      <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/> 
     </security-setting> 
     <address-setting name="#" message-counter-history-day-limit="10" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/> 
     <http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/> 
     <http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http"> 
      <param name="batch-delay" value="50"/> 
     </http-connector> 
     <in-vm-connector name="in-vm" server-id="0"/> 
     <http-acceptor name="http-acceptor" http-listener="default"/> 
     <http-acceptor name="http-acceptor-throughput" http-listener="default"> 
      <param name="batch-delay" value="50"/> 
      <param name="direct-deliver" value="false"/> 
     </http-acceptor> 
     <in-vm-acceptor name="in-vm" server-id="0"/> 
     <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> 
     <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> 
     <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/> 
     <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/> 
     <pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/> 
     </server> 
    </subsystem> 

以下は私のCDIキュークライアントで、WildFlyのローカルArtemisインスタンスにメッセージを送信できます。

@ApplicationScoped 
public class QueueClient { 

    private static final Gson GSON = new Gson(); 

    @Resource(mappedName = "java:jboss/DefaultJMSConnectionFactory") 
    private ConnectionFactory connectionFactory; 

    public void sendMessage(String destinationName, Object message) throws JMSException { 
    try (Connection conn = connectionFactory.createConnection(); 
     Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE)) { 

     Queue queue = session.createQueue(destinationName); 
     final Message consignment = session.createMessage(); 
     consignment.setStringProperty("MEDIA_TYPE", "application/json"); 
     consignment.setStringProperty("BODY", GSON.toJson(message)); 
     session.createProducer(queue).send(consignment); 
    } 
    } 
} 

私の目標リモート ActiveMQのインスタンスにメッセージを投稿します。 server urltopic nameusernamepassword:私は持って何

私の質問:この目標を達成するために設定を変更するにはどうすればよいですか?

代替の質問:上記に回答できない場合は、どうすればこの目標を達成できますか?

ありがとうございます!

答えて

0

私は今週非常に似た問題に苦労しています。

ローカルArtemis Brokerにメッセージを送信し続けますが、ArtemisブローカとリモートActiveMQブローカの間にJMSブリッジを設定してください。

このアプローチではまだ頭痛を覚えましたが、最終的にはうまく機能しました。詳細:

JMS Bridge Between WildFly 10 Artemis and ActiveMQ 5.14 (ONCE_AND_ONLY_ONCE Quality of Service)

+0

私は後で別の解決策を選択しました。私はActiveMQリソースアダプタを使って、通常のwarファイルのようにサーバにデプロイしました。私が大好きだった解決策ではありませんが、うまくいきました。 –

+0

@SayoOladeji、あなたの解決策を詳しくお聞かせください。私はあなたとほぼ同じ質問をしましたhttp://stackoverflow.com/questions/43179283/while-starting-wildfly-10-1-to-work-with-artemis-jboss-ra-activemq-ra-is-not- in – webyildirim

3

では、次のドキュメントを確認しました。

https://docs.jboss.org/author/display/WFLY10/Connect+a+pooled-connection-factory+to+a+Remote+Artemis+Server

それはおそらく、あなたの現在の懸念に対処しています。

ありがとうございました。

EDIT:この投稿に否定的なフラグが立てられたとき。

上記のドキュメントではっきりと説明しているとおりです。 リモートコネクタを使用するプールされた接続ファクトリを作成する必要があり、リモートコネクタはリモートActive MQサーバーのIP xソケットを参照します。 これについては、最初の3つの手順に関するドキュメントを参照してください。

そのようなプール接続ファクトリーの構成は3つの段階で行われ、そしてIが引用されている: /ソケット:

  1. は、リモート・メッセージング・サーバを指し、アウトバウンド・ソケット・バインディングを作成します(ホスト=、ポート= 61616)

  2. 作成されたアウトバウンドソケットバインディングを参照するリモートコネクタを作成します。ステップ(1)で行われる。 /subsystem = messaging-activemq/server = default/remote-connector = remote-artemis:add(socket-binding = remote-artemis)

  3. ステップで作成されたリモートコネクタを参照するpooled-connection-factoryを作成します(2)。 /サブシステム=メッセージング、ActiveMQの/サーバー=デフォルト/プールされた接続工場=リモートアルテミス:(コネクター= [リモートアルテミス]、 エントリ= [javaの:/ JMS/remoteCF])を追加

最後に、プールされた接続ファクトリを正しく構成したら、それをJEEコンテナが使用できるJNDIリソースとして使用できます。 プールされたconnctionファクトリをあなたのbeanに注入し、それを使ってセッションを作成します。

ここでは、JMSメッセージをサーバーに送信する方法の例を示します。 場合によっては、リモート・アクティブMQに関連付けられたプールされた接続ファクトリーへの接続ファクトリーJNDI参照を修正するだけです。

http://www.mastertheboss.com/jboss-server/jboss-jms/sending-jms-messages-over-xa-with-wildfly-jboss-as

そして私は引用:この場合、

@Stateless 
public class JMSService { 


    @Resource(mappedName = "java:jboss/jms/queue/exampleQueue") 
    private Queue queueExample; 

    @Resource(mappedName = "java:/JmsXA") 
    private ConnectionFactory cf; 

    private Connection connection; 
    private MessageProducer publisher; 
    private Session session; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void sendMessage(String txt) { 

     try {   

      connection = cf.createConnection(); 
      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

      publisher = session.createProducer(queueExample); 

      connection.start(); 

      TextMessage message = session.createTextMessage(txt); 
      publisher.send(message); 


     } 
     catch (Exception exc) { 
      exc.printStackTrace(); 
     } 
     finally {   

      if (publisher != null) try { publisher.close(); } catch (Exception ignore) { } 
      if (session != null) try { session.close(); } catch (Exception ignore) { } 
      if (connection != null) try { connection.close(); } catch (Exception ignore) { } 


     } 
    } 
} 

あなたの接続ファクトリは、必要があります:あなたが知っておく必要があり

@Inject 

 @JMSConnectionFactory("java:/jms/remoteCF") 

 private JMSContext context; 

もう一つは、キューがあなたが好きだろうということですあなたのbeanに注入するのはリモートキューです。 リモート・キューにアクセスする方法は、リモート・アクティブMQサーバーでJNDIルックアップを行うことです。 ここで説明します。 http://activemq.apache.org/artemis/docs/1.1.0/using-jms.html#jndi-configuration

私はドキュメントの興味深い部分を開始します。 JNDIの初期コンテキストを使用して、Artemisキューをルックアップする方法を確認できます。

そしてクライアントが「キュー/ OrderQueue」 このキューをバインドしたいならば、JNDIプロパティがそうのように構成されます:

のjava.naming.factory.initial = org.apache.activemq。 artemis.jndi.ActiveMQInitialContextFactory ます。java.naming.provider.url = TCP:// myhostの:5445 queue.queues/OrderQueue = OrderQueue

ルックアップする が構成されていないJMS宛先をも可能です明示的にJNDIコンテキスト環境で使用します。これは、参照文字列内でdynamicQueues /またはdynamicTopics /を使用すると、 が可能です。 たとえば、クライアントが上記の 「OrderQueue」を検索する場合は、文字列 「dynamicQueues/OrderQueue」を使用するだけで済みます。 dynamicQueues/ またはdynamicTopics /の後に続くテキストは、サーバー上の 宛先の名前と正確に一致している必要があります。

これについては、artemisの設定をお読みください。

最後に、もう1つのアプローチがあります。 これはJMSキューブリッジです。 あなたはこれもgoogleを持っています。 しかし、本質的に、JMSブリッジは、キューの内容をリモートキューにトンネリングできるようにすることができます。 このブリッジングのメカニズムは、ローカルのArtemis JMSサーバと同じようにコードをプログラミングする可能性がありますが、すべてのキューはREADまたは公開されているデータがブリッジされているため、実際にはリモートサーバから送信されます。

しかし、あなたには何が一番良いのかを知る必要があります。

私はこれが助けてくれることを願っています。

+1

潜在的なソリューションへのリンクはいつでも歓迎ですが、[リンクの前後にコンテキストを追加](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-本当に良い答え/ 8259#8259)ので、あなたの仲間のユーザーは、それが何であるか、なぜそれがあるのか​​をいくつか考えます。ターゲットサイトに到達できない場合や、永続的にオフラインになる場合は、常に重要なリンクの最も関連性の高い部分を引用してください。外部サイトへのリンク以上になることは、[なぜ、どのように答えが削除されるのか?](http://stackoverflow.com/help/deleted-answers)という理由が考えられます。 – FelixSFD

+0

Uau!真剣に? URLは次のように呼ばれます。Pooled JMS connecitonファクトリをリモートArtemis Serverに接続します。彼の問題は、リモートActive MQサーバに接続する方法です。 完全なドキュメントの言い換えをしたいのですか? – 99Sono

+0

"ターゲットサイトに到達できない場合や、永久にオフラインになる場合に備えて、常に重要なリンクの最も関連性の高い部分を引用します。 – FelixSFD

関連する問題