Я сталкиваюсь с некоторыми проблемами при использовании удаленного соединения JMS между 2 серверами JBoss EAP 7.1 (со встроенным ActiveMQ Artemis).EJB MDB, развернутый на втором сервере, пытается получить доступ к очередям Artemis, развернутым на первом сервере (тот же компьютер, но другой порт).Клиент MDB (вариант использования XA):
1) получает сообщение из очереди запросов, экспортированной первым сервером 2) обрабатывает содержимое сообщения, включая обновления базы данных 3) отправляет ответ в очередь ответов, предоставленную тем же удаленным сервером
Итак, первый сервер экспортирует 3 (Artemis) очереди: - TestQueueReq, для запросов, используемых 2-м сервером приложений - TestQueueRep, для ответов, отправленных 2-м сервером приложений - DLQTestQueue, для очереди недоставленных писем
Извлечение изпервая конфигурация сервера:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
<address-setting name="jms.queue.TestQueue#" dead-letter-address="jms.queue.DLQTestQueue" expiry-address="jms.queue.ExpiryQueue" redelivery-delay="500" redelivery-multiplier="2.0" max-delivery-attempts="3" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
( …/…)
<jms-queue name="DLQTestQueue" entries="java:/jms/queue/DLQTestQueue"/>
<jms-queue name="TestQueueReq" entries="java:/jms/queue/TestQueueReq java:jboss/exported/jms/queue/TestQueueReq" durable="true"/>
<jms-queue name="TestQueueRep" entries="java:/jms/queue/TestQueueRep java:jboss/exported/jms/queue/TestQueueRep" durable="true"/>
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
</server>
</subsystem>
Второй сервер настроен, как описано в https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/configuring_messaging/resource_adapters#use_provided_amq_adapter
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
:…/…)
<http-connector name="remote-http-connector" socket-binding="remote-server" endpoint="http-acceptor"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector"/>
</server>
</subsystem>
Внешняя привязка контекста также настроена на втором сервере в соответствии с этим официальным документом: https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/configuration_guide/configuring_the_naming_subsystem
Сообщение, отправленное в TestQueueReq, правильно используется MDB.
@ResourceAdapter("remote-artemis")
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "TestQueueReq")
}, messageListenerInterface = MessageListener.class)
@ApplicationScoped
public class ExampleSFBean implements ExampleSF, MessageListener {
@Override
public void onMessage(final Message message) {
…
Проблема возникает, когда мы пытаемся в MDB отправить сообщение в ответочередь.Я пробовал много разных стратегий для внедрения ресурсов в MDB:
@Inject
@JMSConnectionFactory("java:/jms/remoteCF")
private JMSContext jmsContext;
@Resource (lookup = "java:global/remoteContext")
private Context remoteContext;
@Resource (lookup="java:global/TestQueueRep")
private Queue queueRep;
Но мы продолжаем получать исключения при попытке отправить ответ из-за проблем внедрения / поиска.
- jmsContext имеет значение null, за исключением случаев, когда MDB имеет аннотацию @ApplicationContext.
- Внедрение queueRep не работает, поскольку поиск не удаётся (с: Недопустимое имя схемы URL "null")
- Сбой поиска вручную с использованием remoteContext сто же, что и в предыдущем, следующее исключение:
Caused by: java.lang.RuntimeException: javax.naming.InvalidNameException: WFNAM00007: Invalid URL scheme name
"null" в org.jboss.as.naming.subsystem.NamingBindingAdd $ LookupManagedReferenceFactory.getReference (NamingBindingAdd.java:451)в org.jboss.as.naming.subsystem.NamingBindingAdd $ MutableManagedReferenceFactory.getReference (NamingBindingAdd.java:354) в org.jboss.as.naming.ServiceBasedNamingStore.lookup (ServiceBasedNamingStore.java:143): еще 99javax.naming.InvalidNameException: WFNAM00007: недопустимое имя схемы URL "null" в org.wildfly.naming.client.WildFlyRootContext.getProviderContext (WildFlyRootContext.java:808) по адресу org.wildfly.naming.client.WildFlyRootContext.lookup (WildFlyRootContext.java:155) по адресу javax.naming.InitialContext.lookup (InitialContext * * 10 * 217) *.
- Вопрос 1: может кто-нибудь сказать мне, что не так с моим кодом / конфигурацией и почему не работает автоматическое внедрение очереди удаленного ответа?Или, по крайней мере, почему ручной поиск из удаленного контекста не работает?И что означает эта ошибка схемы…
- Вопрос 2: если MDB не аннотирован @ApplicationScoped, JMSContext не вводится (ноль).Это нормально?Если да, есть ли какой-либо недостаток, который так комментирует MDB?
Спасибо