Компонент потребителя сообщений системы обрабатывает каждое сообщение и асинхронно уведомляет его с помощью приложения WebSockets, обеспечивающего уход - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь отправить некоторые уведомления от Потребителя rabbitmq через веб-сокет и опубликовать их в угловом приложении.

Я новичок как с rabbitmq, так и с веб-сокетом, и я не знаю, как настроитьwebsocket для получения сообщений от потребителя

Вот мой потребитель:

@Override
@RabbitListener(queues = "${rabbitmq.queue}")
public void onMessage(Message message) {
    String timi = new String(message.getBody());
    JsonObject jsonObject = new Gson().fromJson(timi, JsonObject.class);

    MonitoredData monitoredData = new MonitoredData();
    monitoredData.setIdPatient((jsonObject.get("Id patient")).getAsString());
    monitoredData.setActivity((jsonObject.get("Activity")).getAsString());
    monitoredData.setStartTime((jsonObject.get("Start time")).getAsString());
    monitoredData.setEndTime((jsonObject.get("End time")).getAsString());
    monitoredDataRepo.save(monitoredData);

    if (monitoredData.getActivity().contains("Sleeping")) {
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime date1 = LocalDateTime.from(f.parse(monitoredData.getStartTime()));
        LocalDateTime date2 = LocalDateTime.from(f.parse(monitoredData.getEndTime()));
        Duration d = Duration.between(date1, date2);
        if ((d.getSeconds() / 3600) > 9) {
            System.out.println("The patient slept more than 9 hours");
        }
    }

    if (monitoredData.getActivity().contains("Leaving\t")) {
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime date1 = LocalDateTime.from(f.parse(monitoredData.getStartTime()));
        LocalDateTime date2 = LocalDateTime.from(f.parse(monitoredData.getEndTime()));
        Duration d = Duration.between(date1, date2);
        if ((d.getSeconds() / 3600) > 3) {
            System.out.println("The patient was out more than 3 hours");
        }
    }

    if (monitoredData.getActivity().contains("Toileting\t") || monitoredData.getActivity().contains("Showering\t")) {
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime date1 = LocalDateTime.from(f.parse(monitoredData.getStartTime()));
        LocalDateTime date2 = LocalDateTime.from(f.parse(monitoredData.getEndTime()));
        Duration d = Duration.between(date1, date2);
        if ((d.getSeconds() / 60) >= 30) {
            System.out.println("The patient was in the bathroom more than 30 minutes");
        }
    }

// System.out.println («Полученное сообщение» + сообщение);}

Сообщения, которые я получаю из System.out.println, - это сообщения, которые я хочу разместить во всплывающем окне приложения Angular.

У меня также есть этот контроллер кролика:

@GetMapping("/send")
public String sendMessage() throws InterruptedException {
    producer.produceMsg();
    return "Message successfully sent";
}

1 Ответ

0 голосов
/ 07 ноября 2019

Я также новичок в RabbitMq, но это моя конфигурация для WebSocket.

  @Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    static final String MESSAGE_PREFIX = "/topic";

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker(MESSAGE_PREFIX, "/queue");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

В потребительском классе вы можете ввести SimpMessagingTemplate websocket;и затем вы можете использовать this в RabbitListener: this.websocket.convertAndSend ("/ topic", json);

Что касается части внешнего интерфейса, я использовал React, но я думаю, что это похоже. Вы используете Google SockJs и пытаетесь получать сообщения. Удачи!

...