Интерфейс REST на ActiveMQ Artemis

Я пытаюсь добавить интерфейс REST в ActiveMQ Artemis, создав файл .war с Maven, следуя Документация по интерфейсу Artemis REST. После создания файла .war я перемещаю его в каталог /opt/artemis/apache-artemis-2.13.0/web/ и запускаю ActiveMQ Artemis.

При запуске ActiveMQ Artemis возникает следующее исключение:

WARN [org.eclipse.jetty.webapp.WebAppContext] Failed startup of context o.e.j.w.WebAppContext@4cb702ce{/artemis-rest,file:///var/lib/test-broker/tmp/jetty-0_0_0_0-8161-artemis-rest_war-_artemis-rest-any-15304647904836420970.dir/webapp/,UNAVAILABLE}{/opt/artemis/apache-artemis-2.13.0/web/artemis-rest.war}: java.lang.RuntimeException: You must install RESTEasy as a Bootstrap Listener and it must be listed before this class
    at org.apache.activemq.artemis.rest.integration.RestMessagingBootstrapListener.contextInitialized(RestMessagingBootstrapListener.java:39) [artemis-rest-2.13.0.jar:2.13.0]

Также получение 503 по HTTP-запросу http://192.168.0.50:8161/artemis-rest/queues/test:

HTTP ERROR 503 Service Unavailable
URI:    /artemis-rest/queues/test
STATUS: 503
MESSAGE:    Service Unavailable
SERVLET:    -

У меня не установлен RESTeasy, потому что я не могу понять, как это сделать, поэтому я загрузил файл jar для RESTeasy jaxrs версии 3.13.0.Final и поместил его в каталог WEB-INF/lib, а также включил зависимость для него в pom.xml.

Позвольте мне показать вам свою конфигурацию:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>org.somebody</groupId>
   <artifactId>artemis-rest</artifactId>
   <packaging>war</packaging>
   <name>My App</name>
   <version>1.0-SNAPSHOT</version>

   <dependencies>
      <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.13.0.Final</version>
      </dependency>
      <dependency>
         <groupId>org.apache.activemq.rest</groupId>
         <artifactId>artemis-rest</artifactId>
         <version>2.13.0</version>
         <exclusions>
            <exclusion>
               <groupId>*</groupId>
               <artifactId>*</artifactId>
            </exclusion>
         </exclusions>
      </dependency>
   </dependencies>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app>
   <listener>
      <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</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>
   <context-param>
        <param-name>rest.messaging.config.file</param-name>
        <param-value>file:///WEB-INF/rest-messaging.xml</param-value>
   </context-param>
</web-app>

rest-messaging.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<rest-messaging>
    <server-in-vm-id>0</server-in-vm-id> <!-- deprecated, use "url" -->
    <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> <!-- deprecated, use "url" -->
    <url>vm://0</url>
</rest-messaging>

При необходимости я также могу прикрепить файлы broker.xml, jolokia-access.xml и bootstrap.xml, но они мне кажутся нормальными. Я нашел более старый вопрос об этом здесь, но это не помогло решить эту проблему.

Если вам известны другие подходы к добавлению интерфейса REST в ActiveMQ Artemis, сообщите мне.


person SP.    schedule 31.08.2020    source источник
comment
Из любопытства, почему вы используете интерфейс REST вместо чего-то более стандартного, например STOMP?   -  person Justin Bertram    schedule 31.08.2020
comment
Привет, Джастин. Просьба использовать REST (http, https). Также у меня пока мало информации и знаний.   -  person SP.    schedule 31.08.2020
comment
О каком запросе вы говорите и почему он использует http (s)?   -  person Justin Bertram    schedule 31.08.2020
comment
Это проектный запрос. Одна компания использует REST на серверах, а другая - на устройствах, и в этом случае невозможно (сообщить им) использовать STOMP вместо REST.   -  person SP.    schedule 01.09.2020


Ответы (1)


К сожалению, документация REST для ActiveMQ Artemis некоторое время не проверялась и не обновлялась.

Вы можете получить все, что вам нужно, в файле войны и исключить большую часть того, что вам не нужно, используя это pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>org.somebody</groupId>
   <artifactId>artemis-rest</artifactId>
   <packaging>war</packaging>
   <name>My App</name>
   <version>1.0-SNAPSHOT</version>

   <dependencies>
      <dependency>
         <groupId>org.apache.activemq.rest</groupId>
         <artifactId>artemis-rest</artifactId>
         <version>2.13.0</version>
         <exclusions>
            <exclusion>
               <groupId>org.apache.activemq</groupId>
               <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
               <groupId>io.netty</groupId>
               <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
               <groupId>org.eclipse.jetty.aggregate</groupId>
               <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
               <groupId>org.apache.httpcomponents</groupId>
               <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
               <groupId>org.jboss.logging</groupId>
               <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
               <groupId>org.jboss.logmanager</groupId>
               <artifactId>*</artifactId>
            </exclusion>
         </exclusions>
      </dependency>
   </dependencies>
</project>

Не забудьте добавить in-vm acceptor к вашему broker.xml, например:

      <acceptors>
         ...
         <acceptor name="invm">vm://0</acceptor>
      </acceptors>

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

|-- pom.xml
`-- src
   `-- main
       `-- webapp
           `-- WEB-INF
               `-- web.xml
       `-- resources
           `-- rest.xml

Затем вы можете ссылаться на него в своем web.xml следующим образом:

   <context-param>
        <param-name>rest.messaging.config.file</param-name>
        <param-value>rest.xml</param-value>
   </context-param>

В целом я бы рекомендовал не использовать интерфейс ActiveMQ Artemis REST по двум основным причинам:

  1. Ваш код не будет непереносимым, потому что REST-интерфейс ActiveMQ Artemis является настраиваемым (т. Е. Не стандартизированным) интерфейсом.
  2. Протокол STOMP является повсеместным, простым, стандартизированным и может использоваться практически в любых обстоятельствах и в любой среде, в которой может использоваться REST.

Я рекомендую вам использовать STOMP вместо интерфейса ActiveMQ Artemis REST.

person Justin Bertram    schedule 31.08.2020
comment
Большое спасибо! Работает. Замечена только эта ошибка Эта страница содержит следующие ошибки: ошибка в строке 1 в столбце 111: атом префикса пространства имен в ссылке не определен. Ниже приведен рендеринг страницы до первой ошибки. при использовании http://192.168.0.50:8161/artemis-rest/queues/test в браузере. GET и POST работают нормально при тестировании с помощью curl. - person SP.; 02.09.2020
comment
Да, я получил это с помощью веб-браузера. - person SP.; 02.09.2020
comment
Данные, возвращаемые интерфейсом REST, не предназначены для просмотра в браузере. На самом деле он предназначен только для клиентов обмена сообщениями. Таким образом, вы можете игнорировать эту ошибку, поскольку это не настоящая ошибка. - person Justin Bertram; 02.09.2020