2015-05-22 6 views
1

Я использую Spring MVC, ActiveMQ и WebSocket (через sock.js и stomp.js) для создания приложения для передачи данных в реальном времени.Push Message от ActiveMQ to Spring Controller

Как известно, когда производитель (другое приложение для настольных компьютеров) нажимает сообщение на ActiveMQ, и метод onMessage() поймает его.

public class MessageReceiver implements MessageListener { 
    public void onMessage(Message message) { 
     System.out.println(message); 

     // How to push the message to a Controller in Spring? 
    } 
} 

Большинство учебных пособий просто печатают сообщение на консоль.

У меня есть еще один контроллер под названием WebSocketController:

@Controller 
public class WebSocketController { 
    @SubscribeMapping("/getRealTimeResult.action/{submissionId}") 
    public Message getRealTimeResultAction(
      @DestinationVariable long submissionId) { 
     return new Message("Message content from onMessage() method"); 
    } 
} 

Я хочу, чтобы подтолкнуть сообщение, полученное в onMessage() метода к методу getRealTimeResultAction(). Можете ли вы рассказать мне, как это сделать?

Я знаю, что ActiveMQ может связываться с браузером с помощью stomp через порт 61613.

Я не хочу этого делать, потому что я думаю, что MQ должен быть прозрачным для пользователя. Также мне нужно сделать некоторую авторизацию в WebSocketController.

ответ

0

Вообще говоря @Controller с методами @SubscribeMapping и @MessageMapping может обрабатывать подписки и сообщения от клиентов STOMP, подключенных через WebSocket.

Из вашего описания неясно, что вы пытаетесь сделать. Было ли сообщение перенесено в ActiveMQ через STOMP из браузера или было произведено каким-то другим клиентским JMS-клиентом? Также MessageReceiver получает фактическое сообщение, в то время как метод @Controller имеет метод @SubscribeMapping для обработки подписки от клиента STOMP. Непонятно, что вы пытаетесь сделать. Пожалуйста, предоставьте дополнительную информацию, чтобы я мог дать лучший ответ.

+0

Прежде всего, веб-клиент нажимает на ActiveMQ сообщение (с уникальным идентификатором). Затем внутренний JMS-клиент (не в Spring MVC) получил сообщение и нажимал больше сообщений на ActiveMQ (асинхронно). Таким образом, функция 'onMessage()' в Spring MVC будет вызвана. И теперь я хочу нажать сообщение на контроллер Spring. Что мне делать? –

+0

Являются ли @Controller и MessageReceiver в одном JVM? Если это так, вы можете использовать какой-либо механизм уведомления (например, Spring SpringContext). Или, в зависимости от того, что вы хотите сделать, они могут делиться какой-то структурой данных. –

+0

Да, они находятся в одном и том же веб-проекте. Spring ApplicationContext не может быть хорошим выбором. Любая элегантная реализация? –