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

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

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

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