Как включить REST в кластере ActiveMQ Artemis - PullRequest
0 голосов
/ 21 января 2020

Мы пытаемся настроить интерфейс REST, как указано в документации ActiveMQ Artemis . Он работает в версиях 2.10.1 и 2.9.0, но только в автономном режиме. Кластеризованный 2.9.0 - это наша текущая производственная среда, и именно здесь мы пытаемся настроить интерфейс REST.

У нас есть кластерное активное / пассивное решение, использующее файловый журнал. У нас есть Netscaler перед нашим активным / пассивным решением. Мы нашли этот отчет об ошибке , который мы видим в нашей системе. Эта ошибка решена в 2.3.0, поэтому я думаю, что мы должны запустить TCP вместо in-vm? Как мы это настроим?

Конфиг для нашего рабочего StdAlone: ​​

<web bind="http://lxappqmanv01:8161" path="web">
   <app url="activemq-branding" war="activemq-branding.war"/>
   <app url="artemis-plugin" war="artemis-plugin.war"/>
   <app url="console" war="console.war"/>
   <app url="rest" war="artemis-rest-1.0-SNAPSHOT.war"/>
</web>

В брокере. xml Мы добавили:

<acceptor name="in-vm">vm://0</acceptor>

В сообщениях покоя . xml

<rest-messaging>
   <server-in-vm-id>0</server-in-vm-id>
   <use-link-headers>false</use-link-headers>
   <default-durable-send>false</default-durable-send>
   <dups-ok>true</dups-ok>
   <topic-push-store-dir>topic-push-store</topic-push-store-dir>
   <queue-push-store-dir>queue-push-store</queue-push-store-dir>
   <producer-time-to-live>0</producer-time-to-live>
   <producer-session-pool-size>10</producer-session-pool-size>
   <session-timeout-task-interval>1</session-timeout-task-interval>
   <consumer-session-timeout-seconds>300</consumer-session-timeout-seconds>
   <consumer-window-size>-1</consumer-window-size>
   <url>vm://0</url>
</rest-messaging>

В сети. xml

<web-app>
   <listener>
      <listener-class>com.myapp.artemis.MyResteasyBootstrap</listener-class>
   </listener>

   <listener>

<listener-class>org.apache.activemq.artemis.rest.integration.RestMessagingBootstrapListener</listener-class>
   </listener>

   <filter>
      <filter-name>Rest-Messaging</filter-name>

<filter-class>org.jboss.resteasy.plugins.server.servlet.FilterDispatcher</filter-class>
   </filter>

   <filter-mapping>
      <filter-name>Rest-Messaging</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Работает нормально (при включении ниже класса):

package com.myapp.artemis;

import javax.servlet.ServletContextEvent;
import org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap;
import org.jboss.resteasy.spi.Registry;


public class MyResteasyBootstrap extends ResteasyBootstrap {
    @Override
    public void contextInitialized(ServletContextEvent event)
    {
        super.contextInitialized(event);
        event.getServletContext().setAttribute(Registry.class.getName(), deployment.getRegistry());
    }
}

Как я могу заставить это работать в кластерной среде? Как мы можем использовать TCP вместо in-vm?

1 Ответ

1 голос
/ 22 января 2020

Если вы хотите использовать TCP для REST, вам просто нужно настроить его в rest-messaging.xml, например:

<rest-messaging>
   <use-link-headers>false</use-link-headers>
   <default-durable-send>false</default-durable-send>
   <dups-ok>true</dups-ok>
   <topic-push-store-dir>topic-push-store</topic-push-store-dir>
   <queue-push-store-dir>queue-push-store</queue-push-store-dir>
   <producer-time-to-live>0</producer-time-to-live>
   <producer-session-pool-size>10</producer-session-pool-size>
   <session-timeout-task-interval>1</session-timeout-task-interval>
   <consumer-session-timeout-seconds>300</consumer-session-timeout-seconds>
   <consumer-window-size>-1</consumer-window-size>
   <url>tcp://127.0.0.1:61616</url>
</rest-messaging>

Если вы хотите использовать REST с парой главный / подчиненный HA, то вам следует настройте сервер веб-приложений (например, Tomcat или Jetty) на отдельном компьютере «напротив» главного и подчиненного брокеров и используйте URL-адрес, подобный следующему:

<url>(tcp://master:61616,tcp://slave:61616)?ha=true;reconnectAttempts=-1</url>

При этом я бы не рекомендовал использовать REST поскольку REST относительно прост, стандартного интерфейса REST для обмена сообщениями не существует, поэтому клиенты REST будут привязаны к ActiveMQ Artemis (что не очень хорошо для переносимости приложений). Обычно STOMP - хорошая замена REST. STOMP - это простой текстовый протокол, который можно использовать с JavaScript, и в большинстве случаев он может использоваться в REST, а также его стандартизирован, так что вы найдете множество реализаций клиента на множестве разных языков.

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

...