2

Stomp over Websocket で Spring ブートを使用するサンプルがあります。ブローカーの登録を SimpleBrokerRegistration から StompBrokerRelayRegistration に変更すると、期待どおりに機能しません。

これが私のWebsocket構成です:

@Configuration
@EnableWebSocketMessageBroker
@ConfigurationProperties(prefix = "spring.artemis")
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
//...
 @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // If STOMP broker not configured, create an simple fallback
        if (!StringUtil.isEmpty(host) || port > 0) {
            config.enableStompBrokerRelay("/topic", "/queue")
                    .setRelayHost(host)
                    .setRelayPort(port);
        } else {
            config.enableSimpleBroker("/topic", "/queue");
        }
        config.setApplicationDestinationPrefixes("/app");
    }
@Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello")
                .withSockJS();
    }
//...
}

および ArtemisConfig:

  @Configuration
    @ConfigurationProperties(prefix = "spring.artemis")
    public class JmsConfig implements ArtemisConfigurationCustomizer {
        private static final String DEFAULT_TRANSPORT_PROTOCOLS = "STOMP";

        private String host;
        private int port;
        private String protocols;
    // ...
        @Override
        public void customize(org.apache.activemq.artemis.core.config.Configuration configuration) {
            host = StringUtil.hasText(host)?host:TransportConstants.DEFAULT_HOST;
            port = port > 0? port:TransportConstants.DEFAULT_PORT;
            protocols = StringUtil.hasText(protocols)?protocols:DEFAULT_TRANSPORT_PROTOCOLS;
            Set<TransportConfiguration> acceptors = configuration.getAcceptorConfigurations();
            Map<String, Object> params = new HashMap<>();
            params.put(TransportConstants.HOST_PROP_NAME, host);
            params.put(TransportConstants.PORT_PROP_NAME, port);
            params.put(TransportConstants.PROTOCOLS_PROP_NAME, protocols);
            TransportConfiguration tc = new TransportConfiguration(NettyAcceptorFactory.class.getName(), params);
            acceptors.add(tc);
        }
//...
}

次に、次のように JavaScript を使用して接続します。

var socket = new SockJS('/hello');
            stompClient = Stomp.over(socket);
            stompClient.connect('guest', 'guest', function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/greetings', function(greeting){
                    showGreeting(greeting.body);
                });
            });

キュー /topic/greetings が見つからないと表示されます

そのような SimpMessagingTemplate を使用すると:

messagingTemplate.convertAndSend("/topic/greetings", "WARN: " + warningString());

エラーをスローします:

StompBrokerRelayMessageHandler : Received ERROR {message=[AMQ339001: Destination does not exist: /topic/greetings]} session=...

なぜ SimpleBroker として機能しなかったのかはわかりません。

4

3 に答える 3

1

Artemis broker.xml でこの宛先を事前に作成しましたか? ActiveMQ とは異なり、これを行うか、次のようにアドレス設定ブロックで自動作成を指定する必要があります。

<!--default for catch all-->
<address-setting match="#">
    <dead-letter-address>jms.queue.DLQ</dead-letter-address>
    <expiry-address>jms.queue.ExpiryQueue</expiry-address>
    <redelivery-delay>0</redelivery-delay>
    <max-size-bytes>10485760</max-size-bytes>
    <message-counter-history-day-limit>10</message-counter-history-day-limit>
    <address-full-policy>BLOCK</address-full-policy>
    <auto-create-jms-queues>true</auto-create-jms-queues>
</address-setting>

この場合、任意の宛先が作成されます。ただし、ここに落とし穴があります。キューを定義すると、次のようになります。

<queue name="selectorQueue">
    <entry name="/queue/selectorQueue"/>
    <selector string="color='red'"/>
    <durable>true</durable>
</queue>

実際には、jms 命名規則に従い、実際の名前はjms.queue.selectorQueue. その名前にマッピングすることもできます。

于 2016-03-11T08:54:16.467 に答える
0

SimpMessageSendingOperations2021 年に組み込みの ActiveMQ Artemis でSpring (STOMP) を使用する方法を探している人はいますか? 半日過ごした後、私はあなたに言うことができます。

次の依存関係を追加します (現在、依存関係の競合があるため、自分で最新バージョンを見つけてください)。reactor-netty現在、なんらかの理由で春までに必要な場合は、それなしで実行してみてください。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-artemis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-jms-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-stomp-protocol</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-reactor-netty</artifactId>
        </dependency>

次の構成クラスを作成します。これは、組み込みの artemis サーバーを外部 VM 接続に公開するために必要です。私の理解では、デフォルトでは VM 内接続のみが使用され、ストンプ リレーでこれらを利用する方法が見つかりませんでした。

@Configuration
public class ArenaArtemisConfiguration {

    private final ArtemisProperties artemisProperties;

    public ArenaArtemisConfiguration(ArtemisProperties artemisProperties) {
        this.artemisProperties = artemisProperties;
    }

    @Bean
    public ArtemisConfigurationCustomizer customizer() {
        return configuration -> {
            try {
                configuration.addAcceptorConfiguration(
                        "netty", "tcp://" + artemisProperties.getHost() + ":" + artemisProperties.getPort()
                );
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
        };
    }
}

以下を application.yml に追加します

spring.artemis:
  mode: embedded
  host: localhost
  port: 61616

リレーを介して webSocket メッセージ ブローカーを構成する (この場合は artemis)

@Configuration
public class WebSocketConfiguration extends DelegatingWebSocketMessageBrokerConfiguration {

    private final ArtemisProperties artemisProperties;

    public WebSocketConfiguration(ArtemisProperties artemisProperties) {
        this.artemisProperties = artemisProperties;
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/your-topics")
                .setRelayHost(artemisProperties.getHost())
                .setRelayPort(artemisProperties.getPort());
    }
}

あとは と同じenableSimpleBrokerです。

于 2021-07-18T21:44:11.033 に答える