2

Я изучаю переход на WildFly 10 и, впоследствии, Artemis. Я создал простой проект Spring Websocket, как описано здесь: https://spring.io/guides/gs/messaging-stomp-websocket/. Мясо проекта WebSocketConfig:Интеграция отображения сообщений контроллеров Spring и Artemis

@Override 
public void configureMessageBroker(MessageBrokerRegistry config) { 
    config.enableStompBrokerRelay("/queue/", "/topic/"); 
    config.setApplicationDestinationPrefixes("/app"); 
} 

И контроллер:

@MessageMapping("/hello") 
@SendTo("/topic/greetings") 
public Greeting greeting(HelloMessage message) throws Exception { 
    return new Greeting("Hello, " + message.getName() + "!"); 
} 

Это работает как шарм, как это с ActiveMQ, без дополнительной настройки, необходимые на стороне брокера.

Зная, что Артемида требует либо предварительно созданного назначения, или конкретное упоминание о создании автоматической очереди, я добавил это к моему broker.xml:

<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> 
</address-settings> 

Однако, это не работает, как я ожидал и брокер все же отказался создать /queue/greetings. Итак, я исследовал немного больше и обнаружил, что Артемис, по сути, любит очереди, чтобы быть именами с префиксом jms.queue.*. Я переименовал свою очередь в jms.queue.greetings и сделал следующие изменения в Спринг код: Конфигурация:

... 
config.setPathMatcher(new AntPathMatcher(".")); 
... 

Контроллер:

... 
@SendTo("jms.queue.greetings") 
... 

В моем понимании, это должно заставили мой контроллер для отправки сообщений в эту очередь. Брокеру понравилось это изменение и, наконец, создал очередь, но с контроллером Spring, с другой стороны, не было - в jms.queue.greetings не появляются сообщения.

Я могу заставить себя решить проблему, сделав код менее симпатичным, подписавшись на требуемые очереди с помощью некоторых ручных инъецированных сервисов, но таким образом я потеряю магию Spring sockJS - Artemis (в отличие от RabbitMQ) не кажется поставьте http конечной точке на Stomp, а подключение к ws:// приведет к ошибкам CORS. Кажется, нет встроенной поддержки CORS.

Буду признателен за любые мысли о том, как я могу решить эту проблему.

EDIT: My JS выглядит следующим образом:

var ws = new SockJS('/hello'); 
client = Stomp.over(ws); 
... 
client.connect(login, passcode, function(frame) { 
    client.debug("connected to Stomp"); 
    .... 
    client.subscribe('jms.queue.greetings', function(message) { 
     ... 
    }); 
}); 
... 
client.send("jms.queue.greetings", {}, JSON.stringify({ 'name': text })); 
... 
+0

Как вы пытаетесь отправить сообщение на какой адрес? – Shahbour

+0

Я добавил соответствующий JS-код. –

ответ

1

На основе вашего обновления

При отправке jms.queue.greeting вы рассказываете пружину перенаправить запрос непосредственно Брокер без вводя любой контроллер, если вы хотите отправить сообщение контроллеру, а затем переслать его брокеру, вы должны отправить в свою конфигурацию app.greeting, и этот контроллер отправит его обратно на j ms.queue.greeting

если вы используете.в качестве разделителя использовать его во всех аннотациях

проверить это diagram и он покажет вам разницу между отправкой/приложением и/очередью или/темой первым идти в контроллер второй только перенаправлять

Я использую ниже, и я могу отправить и получить сообщение

//Configuration 
    @Override 
     public void configureMessageBroker(MessageBrokerRegistry config) { 
      config.enableStompBrokerRelay("jms.topic", "jms.queue") 
      .setRelayHost("192.168.65.24") 
      .setRelayPort(5445) 
      .setSystemLogin("root") 
      .setSystemPasscode("XXXXX") 
      .setClientLogin("root") 
      .setClientPasscode("XXXXX"); 
      config.setApplicationDestinationPrefixes("app"); 
      //config.setUserDestinationPrefix("user"); 
      config.setPathMatcher(new AntPathMatcher(".")); 
     } 

     @Override 
     public void registerStompEndpoints(StompEndpointRegistry registry) { 
      registry.addEndpoint("/stomp"); 
     } 


//Subscribtion 
    stompClient.subscribe('jms.queue.call', function(greeting){ 
         showGreeting(JSON.parse(greeting.body).name); 
        }); 

//Sending 
    stompClient.send("jms.queue.call", {}, JSON.stringify({ 'name': message })); 

Один вопрос все еще находится на рассмотрении Артемида является/пользователь /, где DefaultUserDestinationResolver жестко закодировано с/для пользователя разборе.

+0

У вас есть какой-то контроллер со стороны пружины? Я вижу в вашем фрагменте, что у вас установлен префикс «приложение», но он нигде не используется. –

+0

Спасибо за совет, Shahbour, диаграмма действительно помогла. –

+0

Извините, что написал третий комментарий подряд, но я столкнулся с другой проблемой. Spring не хочет отображать сообщение в конечную точку, когда я использую 'antPathMatcher (". ")'. Не имеет значения, использую ли я ''/app "и"/app/hello "префикс и конечную точку или' "приложение" и "app.hello", Spring не вызывает контроллер вообще Это дело. Без контроллера 'AntPathMatcher' вызывается, но явно не может отправить' 'jms.queue.greetings'' Любая идея, что я могу сделать? –

Смежные вопросы