私は春ブーツとApacheのActiveMQのを使用していると私は、クラスタノードの使用を改善するために、Apacheのアルテミスに移行したいです。
私は主の概念使用しています現時点でVirtualTopicsをし、JMSなどで
@JMSListener(destination = "Consumer.A.VirtualTopic.simple")
public void receiveMessage() {
...
}
...
public void send(JMSTemplate template) {
template.convertAndSend("VirtualTopic.simple", "Hello world!");
}
私は、アルテミスはにのアドレスモデルを変更したこと、読んだことがあるアドレス、キューとルーティングタイプの代わりに、キュー、トピックおよび仮想話題のActiveMQのように。私はもっとたくさん読みましたが、私は今、移行することができますどのように、右のそれを得ることはありませんと思います。私はインポートされたので、私は、同じ方法上記のようにそれを試してみましたアルテミスJMSClientを Mavenのからして前のようにそれを使用したいが、とFQQN(完全修飾キュー名)またはVirtualTopic-ワイルドカード、あなたはいくつかのソースで読むことができます。しかし、どういうわけか、それが正しく動作しません。
私の質問は以下のとおりです - どのように私はVirtualTopicsを移行することができますか?私は右FQQNおよびそれらのVirtualTopics、ワイルドカードでそれを入手しましたか? - どのように私は上記のコード例については、エニーキャストとマルチキャストroutingtypesを指定することができますか?(オンラインの例ではアドレスとキューは、サーバーbroker.xmlにハードコードが、私は、アプリケーションの場でそれを作成したい。) - どのように私はopenwireプロトコルでそれを使用することができますし、どのようにアプリケーションが使用するものを知っていますか?それだけで私はアルテミス使用していたポートに依存していますか?openwireのための61616そう?
自分の考えを明確にする缶誰の助け?
更新:
さらにいくつかの質問。
1)私はいつも、「デフォルトの5.xの消費者」のようなものを読んで。それはその後、アルテミスと混合して取得することが期待されますか?あなたはそれらの命名規則のすべてを残し、アルテミスへの依存性をちょうどFQQNにVirtualTopic名にアドレスを追加し、ちょうど変更気に入りましたか?
2)私はすでにと「virtualTopicConsumerWildcards」を試してみた"import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;"
と"import org.apache.activemq.ActiveMQConnectionFactory;"
、だけ後者の場合にはそれが違いを作りました。
3)私はまた、唯一の受容体ではなく、この場合には(ととのプロトコルとしてOpenWireを使用しようとしました"import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;"
「:自分のアプリケーションを起動するときに、私は次のエラーを取得します)2020-03-30 11:41:19,504 ERROR [org.apache.activemq.artemis.core.server] AMQ224096: Error setting up connection from /127.0.0.1:54201 to /127.0.0.1:61616; protocol CORE not found in map: [OPENWIRE]
」。
4)ドゥ私はすなわち置くmulticast:://VirtualTopic.simple
これは、宛先名としてtemplate.convertAndSend(...)
?私が試したtemplate.setPubSubDomain(true)
マルチキャストルーティングのタイプのためにと、エニーキャストのためにこの作品を、それを残しました。しかし、それは良い方法ですか?
5)多分私は私の春・ブート・アプリケーションを「伝える」ことができますどのように、あなたを知っていますtemplate.convertAndSend(...);
Openwireを使用しますか?
仮想トピックの背後にある考え方は、生産者が通常のJMSの方法で、トピックに送信し、sの消費者は、多くの消費者は、ロードバランスに多くのマシン&スレッド上で負荷を実行できるように、論理的なトピックサブスクリプションのための物理的なキューから消費することができるということです。
アルテミスは、内部で話題の加入者モデルごとにキューを使用しており、それが直接、その使用してサブスクリプションのキューに対処する可能性がある完全修飾キュー名(FQQNを)。
例えば、トピックVirtualTopic.simpleサブスクリプションAのデフォルトの5.xの消費先はConsumer.A.VirtualTopic.simple
アルテミスFQQNに置き換えられるアドレスとキューで構成されるVirtualTopic.simple::Consumer.A.VirtualTopic.simple
。
しかしアルテミスはサポートされていた仮想話題ワイルドカードフィルタ機構に自動的に対応するFQQNに消費者の宛先を変換します。フィルタ機構を有効にするには、設定文字列プロパティには、virtualTopicConsumerWildcards
使用することができます。これは、2つの部分で区切られていた;
の消費者の接頭辞で、すなわちデフォルト5.xの仮想トピックをConsumer.*.
、必要になるvirtualTopicConsumerWildcards
のフィルタをConsumer.*.>;2
。
アルテミスは、クライアントから要求された自動作成の送信先にデフォルトで設定されています。使用するタイプのルーティングのどの種類を示すために、アドレスに接続するとき、彼らは特別な接頭辞を指定することができます。彼らは、コンフィギュレーション文字列プロパティを追加することで有効にすることができるanycastPrefix
とmulticastPrefix
アクセプターに、あなたはで詳細を見つけることができルーティングタイプを決定するために接頭辞を使用しました。例えば、アクセプターに追加するanycastPrefix=anycast://;multicastPrefix=multicast://
クライアントが一つだけANYCASTキューのにメッセージを送信する必要がある場合は、送信先を使用する必要がありanycast:://VirtualTopic.simple
、宛先を使用する必要があり、クライアントがマルチキャストにメッセージを送信する必要がある場合は、multicast:://VirtualTopic.simple
。
アルテミス受容体は、それらが自動的にCORE、AMQP、ストンプまたはOPENWIREに使用されているプロトコルを検出するすべてのプロトコルのために単一のポートを使用してサポート、それはプロトコルはプロトコルパラメータを使用してサポートされている制限することができます。
以下のアクセプターは、エニーキャストプレフィックスができanycast://
、マルチキャストプレフィックスmulticast://
61616:エンドポイントのローカルホスト上OPENWIRE以外のすべてのプロトコルを無効にし、仮想トピック消費者のワイルドカードを。
<acceptor name="artemis">tcp://localhost:61616?anycastPrefix=anycast://;multicastPrefix=multicast://;virtualTopicConsumerWildcards=Consumer.*.%3E%3B2;protocols=OPENWIRE</acceptor>
UPDATE:次の例のアプリケーションは、OpenWireプロトコルを使用して、前の受容体とアルテミスのインスタンスに接続します。
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
@SpringBootApplication
@EnableJms
public class Application {
private final String BROKER_URL = "tcp://localhost:61616";
private final String BROKER_USERNAME = "admin";
private final String BROKER_PASSWORD = "admin";
public static void main(String[] args) throws Exception {
final ConfigurableApplicationContext context = SpringApplication.run(Application.class);
System.out.println("********************* Sending message...");
JmsTemplate jmsTemplate = context.getBean("jmsTemplate", JmsTemplate.class);
JmsTemplate jmsTemplateAnycast = context.getBean("jmsTemplateAnycast", JmsTemplate.class);
JmsTemplate jmsTemplateMulticast = context.getBean("jmsTemplateMulticast", JmsTemplate.class);
jmsTemplateAnycast.convertAndSend("VirtualTopic.simple", "Hello world anycast!");
jmsTemplate.convertAndSend("anycast://VirtualTopic.simple", "Hello world anycast using prefix!");
jmsTemplateMulticast.convertAndSend("VirtualTopic.simple", "Hello world multicast!");
jmsTemplate.convertAndSend("multicast://VirtualTopic.simple", "Hello world multicast using prefix!");
System.out.print("Press any key to close the context");
System.in.read();
context.close();
}
@Bean
public ActiveMQConnectionFactory connectionFactory(){
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(BROKER_URL);
connectionFactory.setUserName(BROKER_USERNAME);
connectionFactory.setPassword(BROKER_PASSWORD);
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate(){
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(connectionFactory());
return template;
}
@Bean
public JmsTemplate jmsTemplateAnycast(){
JmsTemplate template = new JmsTemplate();
template.setPubSubDomain(false);
template.setConnectionFactory(connectionFactory());
return template;
}
@Bean
public JmsTemplate jmsTemplateMulticast(){
JmsTemplate template = new JmsTemplate();
template.setPubSubDomain(true);
template.setConnectionFactory(connectionFactory());
return template;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
return factory;
}
@JmsListener(destination = "Consumer.A.VirtualTopic.simple")
public void receiveMessageFromA(String message) {
System.out.println("*********************** MESSAGE RECEIVED FROM A: " + message);
}
@JmsListener(destination = "Consumer.B.VirtualTopic.simple")
public void receiveMessageFromB(String message) {
System.out.println("*********************** MESSAGE RECEIVED FROM B: " + message);
}
@JmsListener(destination = "VirtualTopic.simple")
public void receiveMessageFromTopic(String message) {
System.out.println("*********************** MESSAGE RECEIVED FROM TOPIC: " + message);
}
}