java - 使用 RabbitMQ/ActiveMQ 的自定义消息?

标签 java rabbitmq activemq

我来自 Sidekiq,现在正在转向用于分布式作业的 Java 解决方案。我遇到了 RabbitMQ 和 ActiveMQ,但这些代理似乎使用纯文本或原始字节 [] 消息。我想知道是否可以使用这些框架发送自定义消息?

理想情况下,我会为每个特定的消息类型定义一个 Java 类,并在 worker 和 producer 中使用它。这样的事情可能吗?或者我应该看看其他类型的中间件?

 MyOwnMessageFormat message = new MyOwnMessageFormat(content)
 channel.send(message)

 Message message = channel.receive()
 if (message.class == MyOwnMessageFormat)
 {
      doSomething();
 }

最佳答案

通过像 Camel 这样的服务总线完成时,通过 Java 中的消息代理交换消息要容易得多。您不会失去配置代理端点的灵 active ,并且您的代码仍然与使用的特定传输或消息格式隔离。例如。您可以部署 ActiveMQ 并稍后切换到 RabbitMQ,而无需更新您的代码——只需更新服务总线配置。或者,您可以在向代理发送消息时通过添加消息转换器从普通 Java 序列化切换到 JSON。同样,您的业务层不必修改。

这是一个使用 POJO 生产/消费的示例,其中生产者调用常规 Java 接口(interface),而消费者实现该接口(interface)。该示例假定发送方/接收方是用 Spring 实例化的,以便注入(inject) Camel 端点

消息发送者:

interface MyService {
   MyResult addTask(MyTask task);
}  

class Sender {
    @Produce(uri="activemq:queue:myservice")
    MyService service;

    public void run() {
      MyTask task = new MyTask();
      MyResult result = service.addTask(task);
}

消息接收者:

class Receiver {
    @Consume(uri="activemq:queue:myservice")
    public MyResult addTask(MyTask task) {
         return new MyResult();
    }
}

MyTask 和 MyResult 需要可序列化。

我认为学习 Camel 框架并不难,而且收获很大。

关于java - 使用 RabbitMQ/ActiveMQ 的自定义消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974143/

相关文章:

activemq - 从 ActiveMQ 切换到 RabbitMQ

java - 从 activeMQ 获取所有 Queue

activemq - 正确关闭 ActiveMQ 和 Spring DefaultMessageListenerContainer

c# - Rebus RabbitMQ 对象序列化

RabbitMQ - 基本新手问题

rabbitmq - spring-RabbitMQ 手动监听队列

java - 在 Java 中打印 - 字符距离太近

java - fatal error - CursorIndexOutOf BoundsException :Index 0 requested ,,大小为 0

java - getJSONObject错误: JSONObject ["..."] is not a JSONObject

java - 无法使用 Maven 部署到 Heroku : Forbidden