Уведомить конкретного пользователя с помощью веб-сокета при весенней загрузке

81
6

Я создаю приложение для управления задачами в Spring boot. Ниже приведены мои модели:

public class Task {

private String name;
private String description;
private User assignee;

//getters and setters
}

public class User {

private String name;
private String email;
private String password;

//getters and setters
}

Я использую весеннюю безопасность для пользователя. Теперь предположим, что есть три Users A, B и C. A создает Task и назначает ее для B. В данный момент я пытаюсь отправить уведомление только B, используя websocket. Для этого я создал WebSocketConfiguration:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();
}

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

Контроллер для назначения этой задачи:

@RestController
@RequestMapping("/api/task")
public class TaskController {

@PostMapping("/assign")
public void assign(@RequestBody Task task) {
taskService.assign(task);
}
}

И наконец в сервисе у меня есть:

@Service
public class TaskService {

@Autowired
private SimpMessagingTemplate template;

@Override
public void assign(Task task) {
//logic to assign task
template.convertAndSendToUser(task.getAssignee().getEmail(), "/topic/notification",
"A task has been assigned to you");
}
}

На стороне клиента я использую Angular, и часть подписки выглядит следующим образом:

stompClient.subscribe('/topic/notification'+logged_user_email, notifications => {
console.log(notifications);
})

В настоящее время в консоли ничего не печатается ни для одного из пользователей.

Я следовал этому уроку, который отлично работал для широковещательных сообщений.

Я также использовал этот ответ в качестве ссылки для использования logged_user_email, но он не работает.

Я попытался префикс /user подписаться на /user/topic/notification/ на стороне клиента, как объяснено в этом ответе. Я также попытался использовать queue вместо темы, как объяснено в том же ответе, но я не нашел успеха.

Другие ответы, которые я нашел, упоминают использование @MessageMapping в контроллере, но мне нужно иметь возможность отправлять уведомления из службы.

Таким образом, вопрос заключается в том, как определить, для какого пользователя предназначено уведомление, и как определить это как на стороне сервера, так и на стороне клиента?

спросил(а) 2019-03-26T10:08:00+03:00 1 год, 7 месяцев назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема