【问题标题】:How to properly create RabbitMQ custom message from Java bean with Spring Integration?如何使用 Spring Integration 从 Java bean 正确创建 RabbitMQ 自定义消息?
【发布时间】:2016-02-15 15:53:45
【问题描述】:

我是 Spring Integration 的新手,也许这个问题是微不足道的。我正在查看示例 (https://github.com/spring-projects/spring-integration-samples/tree/master/basic/amqp) 从标准输入创建 RabbitMq 消息:

<int-stream:stdin-channel-adapter id="consoleIn"
    channel="toRabbit">
    <int:poller fixed-delay="1000" max-messages-per-poll="1" />
</int-stream:stdin-channel-adapter>
<int:channel id="toRabbit" />
<int-amqp:outbound-channel-adapter
    channel="toRabbit" amqp-template="amqpTemplate"
    exchange-name-expression="payload.toLowerCase() == 'nack' ? 'badExchange' : 'si.test.exchange'"
    routing-key-expression="payload.toLowerCase() == 'fail' ? 'badKey' : 'si.test.binding'"
    confirm-correlation-expression="payload"
    confirm-ack-channel="good"
    confirm-nack-channel="errors"
    return-channel="returns" />

如果我们需要使用 Java 代码生成自定义消息怎么办。什么是适当的优雅代码?填充消息的 bean 被简化:

package com.mycompany.domain.price;    
public class UpdateMessage implements Serializable {
Date effStartDate;
Date effEndDate;
Long orderId = -1;
String customerFullName;
...
}

【问题讨论】:

    标签: java spring rabbitmq spring-integration


    【解决方案1】:

    this answer;虽然它是在谈论 Axis 而不是 RabbitMQ;同样的技术也适用。

    由于您的UpdateMessage 实现了Serializable,标准消息转换器将为您处理转换为byte[]

    发送没有回复的消息,你的网关接口方法可能是

    public void send(UpdateMessage msg);
    

    在这种情况下,您会使用出站通道适配器。如果您想得到回复,请使用 amqp 出站网关,服务接口可能如下所示

    public UpdateResult send(UpdateMessage msg);
    

    如果您不使用 Serializable 对象,则可能适合使用 json 转换器。

    【讨论】:

    • 加里,谢谢!以前我使用 Listener 进行消息传递。当前的实施是否更好?
    • 我不确定你的意思。你的问题是关于发送消息没有收到它们。如果您正在谈论使用 Spring Integration 入站适配器 Vs。 SimpleMessageListenerContainer,前者在内部使用后者。这真的取决于您的要求。
    • 加里,太好了。最后一个问题:使用 Spring Integration 入站适配器 Vs 有什么优势?一个 SimpleMessageListenerContainer?
    • 完全取决于你的应用;如果您希望将常见的Enterprise Integration Patterns 应用于您的消息(过滤器、拆分器、路由器等),请考虑使用 SI。如果您正在做一些简单的事情,只需使用容器。同样的事情也适用于发布方面,对于简单的用例,考虑只使用RabbitTemplate。但是,使用 SI 意味着您可以稍后进行更改,而无需重写大量代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多