我来自 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/