在Wildfly 10上使用ActiveMQ Artemis的Websockets / STOMP无法正常工作

时间:2017-02-21 17:06:47

标签: java websocket spring-websocket wildfly-10 activemq-artemis

我正在使用Spring WebSockets实现WebSockets应用程序。

作为STOMP经纪人,我想使用Wildfly的Artemis(Active MQ)。

我在standalone-full.xml中进行了以下配置:

  • 添加以下接受器:

    <acceptor name="stomp-acceptor"
        factory-class="org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory">
        <param name="protocols" value="STOMP" />
        <param name="port" value="61613" />
    </acceptor>
    
  • 使用add-user.bat将新的应用程序用户guest / guest添加到application-users.properties

  • 添加以下StompConfiguration(缩写):

    @Configuration
    @EnableWebSocketMessageBroker
    public class StompConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
        }
    
        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.setApplicationDestinationPrefixes("/app");
                config.enableStompBrokerRelay("/topic", "/queue").setRelayHost("localhost").setRelayPort(61613)
                .setClientLogin("guest").setClientPasscode("guest");
            }
        }
    

这似乎在启动时运作良好:

  

16:57:13,890 INFO [org.apache.activemq.artemis.core.server]   (ServerService线程池 - 64)AMQ221020:已启动接受器   localhost:61613 for protocols [STOMP] 16:57:13,892 INFO   [org.apache.activemq.artemis.core.server](ServerService线程池    - 64)AMQ221007:服务器现已上线

但是,我使用Spring的SimpMessagingTemplate发送第一条消息:

template.convertAndSend(topic, payload);

我收到错误

  

ERROR   [org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler]   (reactor-tcp-io-1)收到ERROR {message = [AMQ339001:Destination   不存在:/ topic / abc / 12345 / xyz]}   会话= 系统

使用Stomp,不必预先创建主题。我如何告诉Artemis自动创建它?

1 个答案:

答案 0 :(得分:2)

在我的情况下,2个问题导致了此错误消息:

1) 第一个问题是主题的名称​​不以“jms.topic”开头,但Artemis似乎期望(无论出于何种原因......)。

将代码更改为

template.convertAndSend("jms.topic." + topic, payload);

我可以解决问题。

请注意,还需要更改StompBrokerRelay配置:

 config.enableStompBrokerRelay("jms.topic")

2)应用程序现在有效,但是当我有多个客户端和一个取消订阅该主题时,错误再次出现。此错误及其解决方案(对Artemis 1.3的升级)在此处描述:How update WildFly 10.1.0Final Apache Artemis 1.1.0 to Apache Artemis 1.3