странное поведение - websocket spring - отправлять сообщения пользователю, используя listen / notify postgresql - PullRequest
0 голосов
/ 07 января 2019

Я испытываю странное поведение при настройке веб-сокета с весенней загрузкой. Иногда это работает, иногда нет, просто кажется случайным. Я попробовал несколько настроек, но ни одна из них не оказалась надежной: я переместил последний кусок кода в командной строке внутри основного класса приложения, и последний выбор был другим классом с аннотацией @Component.

Моя установка следующая: я использую драйвер jdbc (pgjdbc-ng) для использования функции прослушивания postgres. У меня есть функция и триггер, который прослушивает конкретную таблицу postgres для вставок. Если что-то происходит, уведомления отправляются через веб-сокет. Другое и угловое приложение, которое использует ng2-stompjs для прослушивания / topic / notificari для уведомлений. Я не публикую код, потому что уведомления не выходят из весны, угловые не проблема.

С уважением,

Это моя WebSocketConfiguration

Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/topic", "/queue", "/user", "/notificari");
    registry.setApplicationDestinationPrefixes("/app");
    registry.setUserDestinationPrefix("/user");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/socket").setAllowedOrigins("*")
            .setHandshakeHandler(new CustomHandshakeHandler());
}

Я использую класс ListenNotify и драйвер JDBC pgjdbc-ng для подключения к базе данных postgresql и использования функции прослушивания уведомления

public class ListenNotify {

private BlockingQueue queue = new ArrayBlockingQueue(20);

PGConnection connection;

public ListenNotify() {


    PGNotificationListener listener = new PGNotificationListener() {
        @Override
        public void notification(int processId, String channelName, String payload) {
            queue.add(payload);
        }
    };

    try {
        PGDataSource dataSource = new PGDataSource();
        dataSource.setHost("localhost");
        dataSource.setDatabase("db");
        dataSource.setPort(5432);
        dataSource.setUser("user");
        dataSource.setPassword("pass");
        connection = (PGConnection) dataSource.getConnection();

        connection.addNotificationListener(listener);

        Statement statement = connection.createStatement();
        statement.execute("LISTEN n_event");
        statement.close();
    } catch (SQLException e) {
        e.printStackTrace();
        }
}

public BlockingQueue getQueue() {
    return queue;
}

}

И, наконец, это код, который создает экземпляр объекта ListenNotify и прослушивает postgres для событий, которые могут инициировать уведомления, которые должны отправляться с использованием веб-сокета.

@Component
public class InstantaNotificari {

@Autowired
SimpMessagingTemplate template;

@EventListener(ApplicationReadyEvent.class)
public void runn() {
    System.out.println("invocare met");
    ListenNotify ln = new ListenNotify();

    BlockingQueue queue = ln.getQueue();

    System.out.println("the que ies "+ queue);

    while (true) {
        try {
            String msg = (String) queue.take();
            System.out.println("msg " + msg);
            template.convertAndSend("/topic/notificari", msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

1 Ответ

0 голосов
/ 10 марта 2019

Я не использовал Spring, поэтому не могу проверить ваш код. Вот моя проверенная версия. Я думаю, что это суммирует различия -

  1. Перейдите на блок с ресурсами. Это закроет соединение при уничтожении класса.
  2. Переместите while (true) в блок try на Listener, чтобы строки внутри блока try никогда не выходят за рамки выполнения.
  3. Класс while (true) блокируется, поэтому он должен находиться в другом потоке. ListenNotify extends Thread

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

Мой проверенный, работающий код находится в этом ответе JMS Websocket отложенная доставка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...