1

J'ai un exemple qui utilise Spring boot avec Stomp sur Websocket. Lorsque je modifie l'enregistrement du courtier de SimpleBrokerRegistration à StompBrokerRelayRegistration, cela ne fonctionne pas comme prévu.Spring Boot + Stomp sur WS avec courtier Artemis intégré "La destination n'existe pas"

Voici ma config 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(); 
    } 
//... 
} 

et 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); 
     } 
//... 
} 

Puis, je me connecte en utilisant javascript comme ça:

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); 
       }); 
      }); 

Il dit ne peut pas trouver la file d'attente/topic/salutations

Lorsque j'utilise SimpMessagingTemplate comme ça:

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

il jette une erreur:

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

Je ne sais pas pourquoi il ne fonctionne pas comme SimpleBroker.

+0

Avez-vous configuré le stomp-acceptor sur votre instance Artemis? –

Répondre

1

Avez-vous créé cette destination dans Artemis broker.xml au préalable? Contrairement à ActiveMQ que vous avez à faire, ou spécifier la création automatique dans le bloc d'adresses Seting, comme ceci:

<!--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> 

Dans ce cas, toute destination sera créé. Cependant, il y a un piège ici. Lorsque vous définissez une file d'attente, comme ceci:

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

Il en fait suivra jms convention de nommage, et ont un nom réel de jms.queue.selectorQueue. Vous pouvez également essayer d'associer ce nom à ce nom.

+0

Comment puis-je définir des files d'attente auto-create-jms lorsque j'utilise l'Artemis intégré de Wildfly? Il n'y a pas de broker.xml dans ce cas ... –

0

Pour une raison inconnue pour moi, Artemis (avec protocole Stomp) semble attendre un nom de sujet pour commencer jms.topic., et un nom de file d'attente avec jms.queue.

Alors Renommez votre sujet à jms.topic.greetings et assurez-vous aussi changer votre configuration StompBrokerRelay à:

config.enableStompBrokerRelay("jms.topic", "jms.queue") 

Dans cette configuration, la file d'attente/sujet sera créé automatiquement en cas de besoin. (J'utilise Artemis 1.3.)