当前位置: 首页 > 知识库问答 >
问题:

使用Apache Camel向Websocket发送RabbitMQ消息

林博厚
2023-03-14

如标题所述,我想使用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运行在我的本地主机上。当我转到http://localhost:15672/时,我可以看到SpringBoot创建了myExchange并且可以使用UI中的Publish Message向它发送消息。例如,我指定“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代理上设置一个名为“测试”的主题。我的路由配置现在如下所示:

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

要发送消息,我使用官方的Kafka客户端库。使用上面发布的相同的JS代码,我现在可以看到MessageObject.Data中的消息。

我仍然想知道为什么同样的方法在RabbitMQ中不起作用?有人有主意吗?

共有1个答案

东方嘉佑
2023-03-14

终于解决了我的问题。

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

以下是我更新的和工作的客户端代码:

     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();
            }
        }
    };
 类似资料:
  • null 谁能给我一个向RabbitMQ发送消息的标准程序的例子。我正在使用Spring Boot,也可以使用它的特性。

  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 我有一个Spring启动应用程序运行在heroku。我使用webSocket为特定用户向客户端和服务器发送消息。我使用Spring引导的SimpMessagingTemplate.convertAndSendToUser来发送和接收消息,当用户需要从服务器获取消息时,这种方法效果很好。我使用Heroku会话亲和力,这意味着即使我扩大了会话的数量,用户和webSocket仍然共享同一个会话。 当我需

  • 我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个: 而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容: 在WebSocketConfig.java中添加队列: 更改GreetingControl

  • 我在服务器端有以下代码: 客户端代码: 我的行动: 我运行应用程序,以的身份登录,并启动从客户端到服务器的消息发送,我看到方法是invokes和line成功执行,但我在客户端没有看到该消息。 我怎么能 Spring Security配置: Web套接字配置: 在建议和阅读主题后,我尝试了以下方式向Spring WebSocket上的特定用户发送消息: 服务器端: 客户端: 服务器端: 客户端: 服

  • 我有一个工作的WebSocket示例,其中客户端从服务器接收消息。 我不确定当客户端连接时,我应该如何向客户端发送旧消息。 示例: 每个客户端在连接时提供其名称 服务器响应“[名称] 刚刚连接”(对所有客户端) 任何新客户端都不会收到这些消息 我想知道客户端是否有任何方法可以接收旧消息(所有消息或过去 5 分钟内的消息都可以接受)。 我怀疑我可能需要自己捕获这些信息,将其存储在某个地方(如数据库)