Я использую apache activemq с пружинной загрузкой и хочу перейти на apache artemis для улучшения использования кластера и узлов.
В настоящее время я использую в основном концепцию VirtualTopics и с JMS, такими как
@JMSListener(destination = "Consumer.A.VirtualTopic.simple")
public void receiveMessage() {
...
}
...
public void send(JMSTemplate template) {
template.convertAndSend("VirtualTopic.simple", "Hello world!");
}
Я прочитал, что Артемис изменил свою модель адресов на адреса, очереди и типы маршрутизации вместо очередей, тем и виртуальных тем как в activemq. Я прочитал намного больше, но я думаю, что не понимаю, как я могу мигрировать сейчас. Я попробовал это так же, как и выше, поэтому я импортировал Artemis JMSClient из Maven и хотел использовать его, как и раньше, но с FQQN (полное имя очереди) или VirtualTopi c -Wildcard вы можете прочитать на некоторых источниках. Но так или иначе это не работает должным образом.
Мои вопросы: - Как я могу перенести VirtualTopics? Я правильно понял с FQQN и этими виртуальными символами-подстановками? - Как я могу указать типы маршрутизации anycast и multicast для примеров кода выше? (В сетевых примерах адреса и очереди жестко закодированы в брокере серверов. xml, но я хочу создать его на лету приложения.) - Как я могу использовать его с протоколом openwire и как приложение знает, что оно использует? Зависит ли это только от порта, которым я пользуюсь? Итак, 61616 для openwire?
Может кто-нибудь помочь прояснить мои мысли?
ОБНОВЛЕНИЕ:
Некоторые дополнительные вопросы.
1 Я всегда читаю что-то вроде «потребитель по умолчанию 5.x». Ожидается ли тогда смешаться с Артемидой? Как если бы вы оставили все эти соглашения об именах и просто добавили адреса к имени VirtualTopi c в FQQN, и просто изменили зависимости на artemis?
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)
для типа многоадресной маршрутизации и оставил его для anycast, это работает. Но это хороший способ?
5) Может быть, вы знаете, как я могу "сказать" моему приложению spring-boot с template.convertAndSend(...);
использовать Openwire?
UPDATE2 : Общие долговременные подписки
@JmsListener(destination = "VirtualTopic.test", id = "c1", subscription = "Consumer.A.VirtualTopic.test", containerFactory = "queueConnectionFactory")
public void receive1(String m) {
}
@JmsListener(destination = "VirtualTopic.test", id = "c2", subscription = "Consumer.B.VirtualTopic.test", containerFactory = "queueConnectionFactory")
public void receive2(String m) {
}
@Bean
public DefaultJmsListenerContainerFactory queueConnectionFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setClientId("brokerClientId");
factory.setSubscriptionDurable(true);
factory.setSubscriptionShared(true);
return factory;
}
Ошибки:
2020-04-17 11:23:44.485 WARN 7900 --- [enerContainer-3] o.s.j.l.DefaultMessageListenerContainer : Setup of JMS message listener invoker failed for destination 'VirtualTopic.test' - trying to recover. Cause: org.apache.activemq.ActiveMQSession.createSharedDurableConsumer(Ljavax/jms/Topic;Ljava/lang/String;Ljava/lang/String;)Ljavax/jms/MessageConsumer;
2020-04-17 11:23:44.514 ERROR 7900 --- [enerContainer-3] o.s.j.l.DefaultMessageListenerContainer : Could not refresh JMS Connection for destination 'VirtualTopic.test' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Broker: d1 - Client: brokerClientId already connected from /127.0.0.1:59979
Что я здесь не так делаю?