【发布时间】:2019-08-15 20:34:24
【问题描述】:
系统由 1 个或多个客户端和单个服务器组成。每个客户端都是手动添加的,并提供一个标识符 (client.id)。每个客户端都可以向服务器发送消息。服务器可以向每个客户端发送消息。所有消息都可以分为两组:有答案和没有答案。
例如一些签名:
CompletableFuture<Response> call(Request requestToServer)void execute(Data dataToSend)
其中 Response、Request 和 Data 是我的 POJO。
所以,我需要某种 RMI 来实现服务器和客户端之间的消息通信。
要求:
- 服务器在处理消息时必须能够通过其 id
client.id识别客户端,但客户端在发送该消息之前不应直接填写此标识符; - 消息应该是 POJO;
- 能够回答异常消息;
- 事件驱动的处理程序(如@RabbitListener) - 多个处理程序 - 每个传入消息类型的spring bean,有或没有返回类型。应根据传入的消息类型自动解析处理程序;
- 由 RabbitMQ 或 ArtemisMQ 支持;
- 从服务器向客户端发送消息的单一服务:发送消息时应提供客户端 ID。示例:
void sendToClient(int clientId, Data dataToClient)。
我尝试设置这种沟通方式的方法:
Spring 集成 我自己的网关与完整的未来 - 太棒了。此外,可以使用
client.id丰富邮件标题 - 很棒。但是我没有找到合适的方法来处理传入的消息并能够回答它。试图发布一个 ApplicationEvent,但所有事件处理程序都有一个 void 返回类型。所以,我的想法是获取相关 ID 并发送回消息,提供该相关 ID - 这看起来不是一个明确的解决方案。-
RabbitListener/RabbitTemplate 缺点:
- 设置 RabbitTemplate 以发送和接收消息的大量代码;
- 需要手动设置请求和回复队列和绑定;
- 在@RabbitHandler 中解析
client.id时出现问题。
-
AmqpProxyFactoryBean 最接近我需要的结果,但有几个我无法解决的问题:
- 在消息处理程序上解析
client.id; - 每个服务接口方法有一个处理程序。
- 在消息处理程序上解析
因此,我需要一个轻量级的解决方案来建立服务之间的通信,并由消息队列提供支持。添加其他消息类型应该很容易 - 声明类,将处理程序添加到消费者并创建该类的对象并从生产者发送。
但也许我完全错了,关于服务通信?也许我不应该为此使用消息队列?
【问题讨论】:
-
这一切都很混乱。 要么你想要RMI或者你想要消息队列。它们是完全不同的编程范式。 JMS 有一个监听器风格的 API。 RMI 有一个方法调用风格的 API。你需要下定决心,这是你想要的。你不能两者兼得。
-
谢谢,我想,如果我在这种情况下将术语 RMI 更改为 RPC,它会更接近我的问题。
标签: java spring message-queue rmi mq