Я испытываю странное поведение при настройке веб-сокета с весенней загрузкой.
Иногда это работает, иногда нет, просто кажется случайным.
Я попробовал несколько настроек, но ни одна из них не оказалась надежной: я переместил последний кусок кода в командной строке внутри основного класса приложения, и последний выбор был другим классом с аннотацией @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();
}
}
}
}