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 として機能しなかったのかはわかりません。