使用Apache Camel将RabbitMQ消息发送到Websocket

时间:2017-11-19 17:25:39

标签: angularjs spring-boot rabbitmq apache-camel

如标题中所述,我想使用RabbitMQ将消息发送到Websocket。使用AngularJS前端我想从Websocket读取RabbitMQ消息并将它们打印到控制台。 原则上我的代码似乎是工作,虽然我无法弄清楚如何获取我的消息的实际(字符串)内容?

后端: 要创建Websocket并进行路由,我使用Spring Boot和Apache Camel:http://camel.apache.org/spring-boot.html

使用Camel进行路由很简单,我的完整Java代码如下所示:

@Component
public final class CamelRoute extends RouteBuilder {

    @Override
    public final void configure() throws Exception {
        from("rabbitmq:localhost/myExchange")
                .to("websocket://myEndpoint?sendToAll=true");
    }
}

运行SpringBoot应用程序没有错误,日志看起来很好:

Route: route1 started and consuming from: rabbitmq://localhost/myExchange

RabbitMQ的: RabbitMQ在我的localhost上运行。当我转到http://localhost:15672/时,我可以看到SpringBoot创建了 myExchange ,我可以使用UI中的发布消息向其发送消息。 例如,我指定“HelloWorld!”作为有效载荷(没有任何标题等)并点击发送。

前端: 要从websocket读取消息,我基本上在AngularJS控制器中执行以下操作:

var socket = {
            start: function () {
                var location = "ws://localhost:9292/myEndpoint";
                this._ws = new WebSocket(location);
                this._ws.onmessage = this._onmessage;
                this._ws.onclose = this._onclose;
            },

            _onmessage: function (m) {
                //Log received RabbitMQ messages from the Websocket
                console.log(m);
            },

            _onclose: function (m) {
                if (this._ws) {
                    this._ws.close();
                }
            }
        };

接收消息似乎原则上有效。 当我进入我的网页(localhost:8080 /)并在Chrome中打开控制台时,它会打印一个包含许多属性的“MessageEvent”对象。 这些属性中没有一个看起来像实际的消息字符串,即:“HelloWorld!”?

enter image description here

更新: 而不是使用RabbitMQ来传递消息,我尝试用Apache Kafka做同样的事情,并且它起作用了。这是我做的:

要测试我只需使用docker-image在本地Kafka代理上设置名为“test”的主题。 我的路线配置现在看起来像这样:

from("kafka:localhost:9092?topic=test&groupId=camelgroupid&autoOffsetReset=earliest&consumersCount=1")
            .to("websocket://dashboard?sendToAll=true");

要发送消息,请使用官方kafka clients library。 使用上面发布的相同JS代码,我现在可以看到MessageObject.data中的消息。

我仍然想知道为什么同样的方法不适用于RabbitMQ?有人有想法吗?

1 个答案:

答案 0 :(得分:0)

终于解决了我的问题。

问题出在客户端。 RabbitMQ通过byte []发送消息。从Websocket读取消息时,需要正确解码byte []。

这是我更新并正在运行的客户端代码:

     var socket = {
        start: function () {
            var location = "ws://localhost:9292/myEndpoint";
            this._ws = new WebSocket(location);
            // RabbitMQ transmits a byte[], therefore we need to change the binary type:
            this._ws.binaryType = 'arraybuffer';
            this._ws.onmessage = this._onmessage;
            this._ws.onclose = this._onclose;
        },

        _onmessage: function (m) {
            // Decode the byte[]:
            var messageString = new TextDecoder('UTF-8').decode(m.data);
            console.log(messageString);
        },

        _onclose: function (m) {
            if (this._ws) {
                this._ws.close();
            }
        }
    };