コード内でのApacheアルテミスキューを作成し、JMSでそれらを使用する方法?

ipolevoy:

私は移行していますJavaLite非同期のアルテミスから2.3.0 2.11.0バージョンに。JavaLite非同期は任意のファイルベースの設定を使用しますが、代わりに、コードに依存していません。

JMS管理API 2.3.0 Vとし、2.11.0 /消え廃止、そして我々は、コア管理APIを使用することが推奨されています。

残念ながら、私はへの道を見つけることができません。

  1. プログラム的にキューを作成します。
  2. 検索そのキューは、メッセージを送受信するためにJMSを使用するようにJNDIを使用しました。

ここで(輸入品を簡潔にするために残されている)の例であります:

class QueueLookup {
    private static final String LOCATION = "./target/artemis";

    private static EmbeddedActiveMQ server;

    public static void main(String[] args) throws Exception {
        try{
            Configuration configuration = new ConfigurationImpl()
                    .setPersistenceEnabled(true)
                    .setBindingsDirectory(LOCATION + "/bindings")
                    .setJournalDirectory(LOCATION + "/journal")
                    .setLargeMessagesDirectory(LOCATION + "/largemessages")
                    .setPagingDirectory(LOCATION + "/paging")
                    .setSecurityEnabled(false)
                    .addAcceptorConfiguration("invm", "vm://0")
                    .setJournalBufferTimeout_AIO(100)
                    .setJournalBufferTimeout_NIO(100)
                    .setJournalType(JournalType.NIO)
                    .setMaxDiskUsage(90);


            //the following three lines have no effect
            CoreQueueConfiguration coreQueueConfiguration = new CoreQueueConfiguration();
            coreQueueConfiguration.setName("Queue123").setDurable(true);
            configuration.addQueueConfiguration(coreQueueConfiguration);


            server = new EmbeddedActiveMQ();
            server.setConfiguration(configuration);
            server.start();


            TransportConfiguration transportConfiguration = new TransportConfiguration(InVMConnectorFactory.class.getName());
            ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);

            Hashtable<String, String> jndi = new Hashtable<>();
            jndi.put("java.naming.factory.initial", "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");
            jndi.put("connectionFactory.ConnectionFactory", "vm://0");
            //# queue.[jndiName] = [physicalName]
            jndi.put("queue.queue/Queue123", "Queue123");

            InitialContext initialContext = new InitialContext(jndi);
            Queue jmsQueue = (Queue) initialContext.lookup("queue/Queue123");

            try (Connection connection = connectionFactory.createConnection()) {
                try(Session jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)){
                    MessageProducer producer = jmsSession.createProducer(jmsQueue);
                    connection.start();
                    TextMessage message = jmsSession.createTextMessage("Hello, Artemis!");
                    producer.send(message);
                    System.out.println("Message sent: " + message.getText());
                }
            } catch (Exception ex){
                ex.printStackTrace();
            }

        }finally {
            server.stop();
        }
    }
}

これらの行には効果がありません。

CoreQueueConfiguration coreQueueConfiguration = new CoreQueueConfiguration();
coreQueueConfiguration.setName("Queue123").setDurable(true);
configuration.addQueueConfiguration(coreQueueConfiguration);

しかし、私はこの行を削除する場合:

jndi.put("queue.queue/Queue123", "Queue123");

その後、JNDIは、キューを見つけることができません。

表面には、私がJNDIに自分の名前を追加することで、キューを「作る」ことができると思わ:

jndi.put("queue.queue/Queue123", "Queue123");

しかし、これは唯一のキューで、部分的に動作しますメッセージを送受信するために既存しているように見える、しばらくどちらQueueControlQueueBrtowserそれを見つけることができます。

缶誰かが私はコード(でこれを行うことができますどのように説明してくださいなしXML構成):

  1. キューを作成し、すべての必要なパラメータ(耐久性、など)を渡します
  2. JNDIを使用してこのキューを検索
  3. QueueControlを使用してこのキューを制御
  4. QueueBrowserを使用してこのキューを参照します。

GUI版との完全な完全な例は、ここで見つけることができます:https://github.com/ipolevoy/artemis-sanbox/blob/master/src/main/java/examples/

多くの任意の助けに感謝!

ジャスティン・バートラム:

ここでカップルの誤解があるように見えます...

まず、あなたはその理由CoreQueueConfiguration、それは有効ではないため、「何の効果」がないです。あなたはキューがバインドされるというアドレスの名前を指定していないので、それは有効ではありません。それは設定が有効でないことを示す起動したとき、ブローカーはこのような何かをログに記録する必要があります。

WARN  [org.apache.activemq.artemis.core.server] AMQ222275: Failed to deploy queue <queue name>: null

で述べたようにJMSツーコアマッピングのドキュメント、JMSキューは、コアアドレスとあるエニーキャストと同じ名前を持つコアキュー。したがって、あなたの代わりにこのような構成を使用する必要があります。

coreQueueConfiguration.setAddress("Queue123").setName("Queue123").setDurable(true).setRoutingType(org.apache.activemq.artemis.api.core.RoutingType.ANYCAST);

私の推測では、物事が部分的にあるため、デフォルトで作業しているということであるコアJMSクライアントが自動的に作成し、それはあなたが自動的に関わらず作成されますあなたのJNDIプロパティで設定するものは何でもそう必要があると目的地をCoreQueueConfiguration指定してきました。あなたがJMS宛先に必要な基本的なアドレスとキューを自動作成したくないなら、あなたは、対応するアドレス設定を使用して、これを無効にする必要があります。彼らはもはや使用されたときに、自動削除のアドレスとキューへの設定もありません(つまり、ときにメッセージカウント= 0&counsumerカウント= 0)あなたはおそらく同様に無効にしたいと思います。ここでは例を示します。

server.getAddressSettingsRepository().addMatch("#", new AddressSettings()
   .setAutoCreateQueues(false)
   .setAutoDeleteQueues(false)
   .setAutoCreateAddresses(false)
   .setAutoDeleteAddresses(false));

第二に、JNDIの設定はで説明されているドキュメントのこのビット

JMS宛先は、典型的には、JNDI経由でルックアップされます。接続ファクトリと同じように、目的地は、JNDIコンテキスト環境での特殊な性質を利用して設定することができます。プロパティ名は、パターンに従ってください:queue.<jndi-binding>またはtopic.<jndi-binding>プロパティの値は、 ApacheのActiveMQのアルテミスサーバーによってホストされているキューの名前でなければなりません。

あなたはこの行を必要とする理由を説明しています:

jndi.put("queue.queue/Queue123", "Queue123");

文書はまた述べて:

これは、JNDIコンテキストの環境の中で明示的に設定されていないルックアップのJMS宛先にも可能です。これは、使用して可能であるdynamicQueues/か、dynamicTopics/ルックアップ列に。クライアントは、ルックアップするために、前述の「OrderQueue」を望んでいた場合例えば、それは文字列「dynamicQueues / OrderQueue」を使って、そう簡単に行うことができます。注、以下のテキストdynamicQueues/またはdynamicTopics/サーバー上の宛先の名前に正確に対応しなければなりません。

あなたは上記の行を除外し、代わりに、ルックアップのこの種を使用することができることをこの意味:

Queue jmsQueue = (Queue) initialContext.lookup("dynamicQueues/Queue123");

それはあなたが単純にJMS APIを使用して目的地をインスタンスに対してまったくここにJNDIを使用する理由、それは明らかではない、と述べました。あなたは、すべてのJNDIコード、例えばを除去することで、実質的にそのコードを簡素化することができます:

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://0");

try (Connection connection = connectionFactory.createConnection(); 
     Session jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) {
   MessageProducer producer = jmsSession.createProducer(jmsSession.createQueue("Queue123"));
   connection.start();
   TextMessage message = jmsSession.createTextMessage("Hello, Artemis!");
   producer.send(message);
   System.out.println("Message sent: " + message.getText());
} catch (Exception ex) {
   ex.printStackTrace();
}

キューの使用のために、このような何かをコントロールを取得するには:

QueueControl coreQueueControl = (QueueControl) server.getManagementService().getResource(org.apache.activemq.artemis.api.core.management.ResourceNames.QUEUE + "Queue123");

キューを参照するには、使用することができますjavax.jms.QueueBrowserそのため、ウェブ上のチュートリアルはたくさんあります。

我々はAMQP、MQTT、およびOpenWireのサポートを追加した後、バージョン2.0.0がリリースされる前に最後に、JMSの構成および管理のビットを廃止するという決定がなされました。その時点で、それだけでコアリソース(すなわちアドレス、キュー、およびルーティング・タイプ)までの設定と管理を簡素化する意味がありました。すべてのコアのものを持ってプラス JMS用の設定と管理に対応するには、確かにユーザーの混乱を引き起こしているだろうとも維持が困難だっただろう。私たちは、すべてがコアリソースに至るまで、様々なサポートされているプロトコルやAPIからマップする方法を説明する文書を更新かなりの時間を費やしました。この文書は、あなたが役に立つかもしれ概要を説明します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=346576&siteId=1