【问题标题】:Java Spring Stomp AMQPJava Spring Stomp AMQP
【发布时间】:2018-12-24 01:55:49
【问题描述】:

我有三个项目:

  1. Javascript SockJS STOMP 客户端

  2. Spring-boot STOMP 端点和 AMQP

  3. Spring-boot AMQP (RabbitListener) 客户端进行测试

    我正在使用 RabbitMQ 消息代理(+Stomp 插件)并正常配置了 amqpstomp 端点。 .当我使用 RabbitTemplate 将消息发送到队列并且第三个项目(用于测试的 spring-boot amqp 客户端)通常订阅此消息时,一切正常!但是 Javascript STOMP 客户端没有收到此消息.. 附言当我使用 SimpMessagingTemplate 发送消息时,JS 客户端可以正常接收消息!

Javascript SockJS STOMP 客户端

        var socket = new SockJS('http://localhost:8090/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect('guest','guest', function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/testqueue', function(greeting){
                showGreeting(JSON.parse(greeting.body).content);
            });
        });

spring-boot STOMP 端点和 AMQP

    @Controller
    public class SampleController {
        Logger logger = Logger.getLogger(SampleController.class);
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        private SimpMessagingTemplate messagingTemplate;
    
        @Autowired
        public SampleController(SimpMessagingTemplate messagingTemplate) {
            this.messagingTemplate = messagingTemplate;
        }
    
        @GetMapping("/emit/{message}")
        @ResponseBody
        String queue1(@PathVariable("message") String message) throws Exception {
            logger.info("Emit to testqueue");
            rabbitTemplate.convertAndSend("/topic/testqueue", new Greeting("Salam olsun " + message));
            Thread.sleep(60000); // simulated delay
            return "Emit to testqueue";
        }
}

用于测试的spring-boot amqp客户端

@Component
public class RabbitMqListener {
    Logger logger = Logger.getLogger(RabbitMqListener.class);

    @RabbitListener(queues = "/topic/testqueue")
    public void processQueue1(String message) {
        logger.info("Received from queue : " + message);
    }
}

如何在 RabbitMQ 中混合 amqp 和 stomp 协议?我想使用 amqp 协议(RabbitTemplate)从另一个项目发送消息,并从 JS STOMP 客户端(SockJS)接收此消息。谢谢。

【问题讨论】:

  • 您确定您的应用程序配置中有enableStompBrokerRelay()docs.spring.io/spring/docs/5.0.7.RELEASE/…
  • 当然……我用 enableStompBrokerRelay 实现了 RabbitMQ。 (主机、端口、用户名、密码)
  • 您有没有机会在 GitHub 上与我们分享一些简单的项目,让我们玩弄它并重现您所担心的问题?那里有一些 README 以及如何复制的说明也会很棒。
  • 请尝试找出混合 AMQP 和 STOMP 协议时缺少什么:rabbitmq.com/stomp.html。特别注意For SEND frames, the message is sent to the amq.topic exchange with the routing key <name>.。所以,你的 rabbitTemplate.convertAndSend("/topic/testqueue", ...) 听起来不对。
  • 感谢 Artem,我已将 rabbitTemplate.convertAndSend("/topic/testqueue", ...) 更改为 rabbitTemplate.convertAndSend("amqp.topic","testqueue" ...) 并且每个想法都有效很好)))

标签: rabbitmq spring-amqp stomp sockjs


【解决方案1】:

我已将rabbitTemplate.convertAndSend("/topic/testqueue", ...) 更改为rabbitTemplate.convertAndSend("amq.topic","testqueue" ...) 并且everythink 工作正常)))特别感谢Artem Bilan 的支持。祝你好运

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 2015-05-10
    • 2018-06-19
    • 2012-11-02
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多