Удаленный поиск между JBoss EAP 7.1 со встроенным ActiveMQ Artemis - PullRequest
0 голосов
/ 03 октября 2018

Я сталкиваюсь с некоторыми проблемами при использовании удаленного соединения 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?

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2018
  1. Вы создали пользователя приложения на сервере сообщений с ролью гостя, если нет, пожалуйста, посмотрите это https://www.youtube.com/watch?v=Ef0HFbyaHFs В моем случае я создал пользователя как MSGTEST с паролем "Welcome1!"поэтому ваша запись на другом сервере должна выглядеть следующим образом.

  2. После того, как вы создадите этого пользователя, вам нужно добавить, что вы подключили к фабрике соединений нечто подобное со свойствами user = "MSGTEST" пароль= "Welcome1!"

<code><pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />

3. Убедитесь, что @ResourceAdapter ("remote-artemis") в вашем MDB получен изправильный пакет import org.jboss.ejb3.annotation.ResourceAdapter;

Так как это НЕ РАБОТАЕТ ==> import org.jboss.annotation.ejb.ResourceAdapter;

Надеюсь это поможет.Я создаю сервер сообщений на machine1 и развернул MDB на Machine2.Это сработало.

Забыл упомянуть, что в обоих случаях я использовал standalone-full.xml, поскольку в нем есть все подсистемы для активных сообщений MQ.Только использование standalone.xml не будет работать.BEWARE!

...