Я изучаю переход на 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 }));
...
Как вы пытаетесь отправить сообщение на какой адрес? – Shahbour
Я добавил соответствующий JS-код. –