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