如标题中所述,我想使用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!”?
更新: 而不是使用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?有人有想法吗?
答案 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();
}
}
};