提问者:小点点

STOMP确认字符帧在RabbitMQ中的位置?


我有一个通过Stomp订阅发送消息的应用程序。当收到消息时,它们会发送确认字符帧。我想在服务器端处理这个ack帧,我的问题是在Rabbitmq或ack处理程序中是否有任何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;
        }

}

然而,该方法拦截每个入站事件,但我只需要确认字符消息。在这种情况下,我如何才能仅获取确认字符帧标头?


共1个答案

匿名用户

STOMP协议不支持告诉发送者他们的消息已被确认,因此您需要在应用程序级别而不是协议级别实现您的解决方案。您可以通过在发送者和消费者中实现请求/响应模式来做到这一点。

当然,这将显著增加客户端进行的通信量,这可能会限制应用程序的可伸缩性,但是如果您希望使用STOMP实现此功能,则无法避免通信开销。