У меня есть этот код: на стороне клиента с JavaScript:Отправить уведомление отключенных упорным ТОПАЮТ очереди
socket = new SockJS(context.backend + '/myWebSocketEndPoint');
stompClient = Stomp.over(socket);
stompClient.connect({},function (frame) {
stompClient.subscribe('/queue/'+clientId+'/notification', function(response){
alert(angular.fromJson(response.body));
});
});
В этом коде, клиент, когда соединяется, подписаться на получение уведомлений с помощью «/ очередью /» + его идентификатор клиента + '/ уведомление /. Поэтому у меня есть очередь для каждого клиента. Я использую stomp с sockjs
На моем сервере (Java + spring boot) у меня есть прослушиватель уведомлений, который при публикации события отправляет уведомление всем клиентам. Так у меня есть:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/myWebSocketEndPoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
классового MenuItemNotificationChannel, называющее MenuItemNotificationSender отправить уведомление пользователей.
@Component
public class MenuItemNotificationChannel extends AbstractNotificationChannel {
@Autowired
private MenuItemNotificationSender menuItemNotificationSender;
@Autowired
private UserRepository userRepository;
@Override
public void sendNotification(KitaiEvent<?> event, Map<String, Object> notificationConfiguration) throws Exception {
String menuItem = Optional.ofNullable((String) notificationConfiguration.get(MENU_ENTRY_KEY)).orElseThrow(IllegalArgumentException::new);
List<User> userList = userRepository.findAll();
for(User u: userList){
menuItemNotificationSender.sendNotification(new MenuItemDto(menuItem),u.getId());
}
MenuItemNotificationSender класс:
@Component
public class MenuItemNotificationSender {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Autowired
public MenuItemNotificationSender(SimpMessagingTemplate messagingTemplate){
this.messagingTemplate = messagingTemplate;
}
public void sendNotification(MenuItemDto menuItem,Long id) {
String address = "/queue/"+id+"/notification";
messagingTemplate.convertAndSend(address, menuItem);
}
}
Этот код работает отлично: уведомления отправляются каждому пользователю. Но если пользователь не подключен к сети, оповещения теряются. Мои вопросы:
Как я могу проверить whit stomp какие подписи активны, а какие нет? (Если я могу проверить, активна ли подписка, я решаю свою проблему, потому что я сохраняю уведомление для пользователей в автономном режиме, а затем отправляю их при входе в систему)
Могу ли я использовать постоянные очереди? (Я читал что-то об этом, но я не понимаю, если я могу использовать его только с топать и sockjs)
Извините за мой английский! : D
Спасибо, я так и думал что-то вроде этого :) – Catechacha
что-нибудь .. это усовершенствовать .. но вы можете безопасно, начиная с этого –