Мне нужно реализовать RPC через STOMP, где клиент работает с javascript в браузере, а на стороне сервера реализованы возможности обмена сообщениями Spring.
Хотя использование @MessageMapping подходит для обычного обмена сообщениями, я считаю использование @SendToUser весьма ограничивающим для реализации RPC, потому что клиенту трудно понять, какой ответ связан с каким запросом в сценарии, когда от клиента отправляются несколько одновременных запросов.
Конечно, нет проблем, когда делается только один запрос, и клиент ожидает его ответа, но проблемы возникают, когда клиенту приходится отслеживать несколько «открытых» вызовов rpc.
Мне удалось сделать систему в основном хорошей, связав идентификатор с каждым запросом, то есть: клиент отправляет идентификатор вместе с сообщением, а сервер отвечает специальной оболочкой сообщения, содержащей этот идентификатор, поэтому клиент может связывать асинхронные ответы с запросами.
Это нормально работает, но имеет несколько ограничений:
Мне нужно разработать код, который должен понимать эту структуру, и который не позволяет использовать простые аннотированные методы.
когда код на стороне сервера генерирует исключение, вызывается Spring @MessageExceptionHandler и клиенту возвращается правильное исключение, но идентификатор запроса теряется, потому что у обработчика нет (простого) способа доступа к нему.
Я знаю, что с rabbitmq мы можем добавить заголовок «reply-to» к каждому запросу, который должен быть связан со специальным ответом (ответом rpc), и это реализуется путем создания специальной временной очереди, на которую пользователь автоматически подписывается, но как я могу использовать эту схему весной? Кроме того, это свяжет меня с конкретным брокером.
Как я могу элегантно реализовать в Spring правильный вызов RPC, который правильно обрабатывает исключения на стороне сервера?
Я считаю, что это общая проблема, и я думаю, что Spring может значительно выиграть, если будет реализовывать ее изначально.