Thorntail JMS для удаленного сервера ActiveMQ? - PullRequest
3 голосов
/ 16 мая 2019

Я создаю простую службу Thorntail, которая записывает текстовое сообщение в удаленную очередь ActiveMQ, и это сообщение используется MDB.Чтобы проверить это, я запустил ActiveMQ в локальном контейнере Docker.Соответствующая часть моего docker-compose.yml файла выглядит следующим образом:

activemq:
  image: webcenter/activemq
  ports:
      - 1883:1883
      - 5672:5672
      - 8161:8161
      - 61613:61613
      - 61614:61614
      - 61616:61616
  environment:
      - ACTIVEMQ_CONFIG_NAME=holocron-mq
      - ACTIVEMQ_CONFIG_DEFAULTACCOUNT=false
      - ACTIVEMQ_ADMIN_LOGIN=mqadmin
      - ACTIVEMQ_ADMIN_PASSWORD=password
      - ACTIVEMQ_CONFIG_QUEUES_queue1=myqueue1
      - ACTIVEMQ_CONFIG_SCHEDULERENABLED=true
      - ACTIVEMQ_USERS_edgeproducer=password
      - ACTIVEMQ_USERS_edgeconsumer=password

Файл My Thorntail project-defaults.yml настроен для подключения к этому «удаленному» серверу с такой конфигурацией:

swarm:
  network:
    socket-binding-groups:
      standard-sockets:
        outbound-socket-bindings:
          remote-activemq-socket-binding:
            remote-host: 127.0.0.1
            remote-port: 61616
  messaging-activemq:
    servers:
      default:
        remote-connectors:
          remote-activemq-connector:
            socket-binding: remote-activemq-socket-binding
        pooled-connection-factories:
          remote-connection-factory:
            user: edgeproducer
            password: password
            connectors:
              - remote-activemq-connector
            entries:
              - 'java:/jms/remote-mq'
              - 'java:/DefaultJMSConnectionFactory'
        jms-queues:
          session-tracking-queue:
            entries:
              entry: 'java:/jms/queue/testQueue'

Моя служба JAX-RS имеет следующие 2 свойства JMS, которые (в конечном итоге) позволяют мне записывать в очередь:

@Inject
@JMSConnectionFactory("java:/jms/remote-mq")
private JMSContext jmsContext = null;

@Resource(mappedName = "java:/jms/queue/testQueue")
private Queue processingQueue = null;

Наконец, мой MDB имеет следующие аннотации, позволяющие ему читать из очереди:

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/testQueue"),
        @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10") })
@ResourceAdapter("remote-connection-factory")

Однако, когда я запускаю свой Thorntail uberjar, я получаю следующие ошибки:

AMQ214031: Failed to decode buffer, disconnect immediately.: java.lang.IllegalStateException: java.lang.IllegalArgumentException: AMQ119032: Invalid type: 1
AMQ212037: Connection failure has been detected: java.lang.IllegalArgumentException: AMQ119032: Invalid type: 1 [code=GENERIC_EXCEPTION]

Я не совсем уверен, что я упустил в своей конфигурации, котораявызывая эту проблему.Кто-нибудь может пролить свет на то, что я делаю неправильно?

1 Ответ

1 голос
/ 22 мая 2019

Вы пытаетесь использовать ActiveMQ Artemis «основной» JMS-клиент (т.е. реализацию JMS-клиента по умолчанию в Thorntail) с брокером ActiveMQ 5.x.ActiveMQ Artemis - это следующее поколение брокера сообщений ActiveMQ, и основной JMS-клиент Artemis не может общаться с 5.x брокером.Я рекомендую вам использовать ActiveMQ Artemis в вашем контейнере Docker.Он обратно совместим с реализацией клиента OpenWire JMS, которую поддерживает брокер 5.x, а также поддерживает все другие протоколы (например, AMQP, STOMP, MQTT).

...