ActiveMQ Artemis 上的 REST 接口
REST interface on ActiveMQ Artemis
我正在尝试通过使用 Maven 按照 Artemis REST interface 文档构建 .war 文件来将 REST 接口添加到 ActiveMQ Artemis。
生成 .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]
此外,在 HTTP 请求中获取 503 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,因为我不知道如何安装,所以我下载了 RESTeasy jaxrs 3.13 版的 jar 文件。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>
休息-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
文件,但它们对我来说似乎没问题。我发现了关于此 here 的较旧问题,但它无助于解决此问题。
如果您知道将 REST 接口添加到 ActiveMQ Artemis 的其他一些方法,请告诉我。
很遗憾,ActiveMQ Artemis 的 REST 文档有一段时间没有得到验证或更新。
您可以在 war 文件中获得您需要的所有内容,并排除大部分您 不需要 使用此 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 受体添加到您的 broker.xml
,例如:
<acceptors>
...
<acceptor name="invm">vm://0</acceptor>
</acceptors>
此外,如果您按如下方式构建项目,则可以自动包含 REST 配置 XML:
|-- 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 接口,主要原因有两个:
- 您的代码不会可移植,因为 ActiveMQ Artemis REST 接口是自定义(即非标准化)接口。
- STOMP 协议无处不在、简单、标准化,几乎可以用于可能使用 REST 的所有情况和环境。
我建议您使用 STOMP 代替 ActiveMQ Artemis REST 接口。
我正在尝试通过使用 Maven 按照 Artemis REST interface 文档构建 .war 文件来将 REST 接口添加到 ActiveMQ Artemis。
生成 .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]
此外,在 HTTP 请求中获取 503 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,因为我不知道如何安装,所以我下载了 RESTeasy jaxrs 3.13 版的 jar 文件。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>
休息-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
文件,但它们对我来说似乎没问题。我发现了关于此 here 的较旧问题,但它无助于解决此问题。
如果您知道将 REST 接口添加到 ActiveMQ Artemis 的其他一些方法,请告诉我。
很遗憾,ActiveMQ Artemis 的 REST 文档有一段时间没有得到验证或更新。
您可以在 war 文件中获得您需要的所有内容,并排除大部分您 不需要 使用此 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 受体添加到您的 broker.xml
,例如:
<acceptors>
...
<acceptor name="invm">vm://0</acceptor>
</acceptors>
此外,如果您按如下方式构建项目,则可以自动包含 REST 配置 XML:
|-- 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 接口,主要原因有两个:
- 您的代码不会可移植,因为 ActiveMQ Artemis REST 接口是自定义(即非标准化)接口。
- STOMP 协议无处不在、简单、标准化,几乎可以用于可能使用 REST 的所有情况和环境。
我建议您使用 STOMP 代替 ActiveMQ Artemis REST 接口。