Куда идет кадр STOMP ACK в RabbitMQ? - PullRequest
0 голосов
/ 20 января 2020

У меня есть приложение, в которое я отправляю сообщения через подписки Stomp. Когда сообщения получены, они отправляют кадр ACK. Я хотел бы обработать этот ack-фрейм на стороне сервера, и у меня есть вопрос, есть ли какой-нибудь ack-слушатель в rabbitmq или ack-обработчик, который будет принимать этот фрейм и его заголовки? Я хочу получить доступ к этому кадру, чтобы отправить производителю подтверждение того, что сообщение получено.

stompClient.subscribe('/topic/'+ thread, function (greeting) {  
                var divId = "#userinfo";                    
                console.log("SENDING TO TOPIC/GREETING")
                showGreeting(divId, JSON.parse(greeting.body).person,
                JSON.parse(greeting.body).message);
                greeting.ack();
                }, {id: thread, ack:'client'});
@MessageMapping("/message")  
public MessageTemplate send(MessageTemplate messageTemp) throws Exception {
    MessageTemplate message = new MessageTemplate(messageTemp.getPerson(), messageTemp.getMessage(), messageTemp.getTo());
    rabbitTemplate.convertAndSend("amq.topic", messageTemp.getTo(), message);
    return message;
}
<<< MESSAGE
subscription:other
destination:/topic/other
message-id:T_other@@session-8-X11WtIiVQr-7UcONamng@@3
redelivered:false
__TypeId__:com.patrykmaryn.spring.second.springsecond.MessageTemplate
priority:0
persistent:true
content-encoding:UTF-8
content-type:application/json
content-length:46
>>> ACK
message-id:T_other@@session-8-X11WtIiVQr-7UcONamng@@3
subscription:other

РЕДАКТИРОВАТЬ

Я думал, что смогу использовать

@Override
    public void configureClientInboundChannel(ChannelRegistration registration) {   
        registration.interceptors(inBoundInterceptor);
    }

И затем в

public class InboundMessagesChannelInterceptor implements ChannelInterceptor {

     @Override
        public Message<?> preSend(Message<?> message, MessageChannel messageChannel) {
            // here's some logic to do with ACK frame like sending a 
            // notifiction message to the sender
            return message;
        }

}

Однако метод перехватывает каждое входящее событие, но мне нужно только сообщение ACK. В таком случае, как я могу получить только заголовки кадра ACK?

1 Ответ

0 голосов
/ 20 января 2020

Протокол STOMP не поддерживает сообщение отправителю о том, что его сообщение было подтверждено, поэтому вам потребуется реализовать свое решение на уровне приложения, а не на уровне протокола. Вы можете сделать это, внедрив шаблон запроса / ответа в отправителе и получателе.

Это, конечно, значительно увеличит объем обмена данными, который осуществляют ваши клиенты, что потенциально может ограничить масштабируемость вашего приложения, но нет способа избежать накладных расходов на обмен данными, если вы хотите использовать эту функцию с STOMP.

...