【问题标题】:Is it possible to use a RabbitMessagingTemplate as AmqpOutboundEndpoint?是否可以使用 RabbitMessagingTemplate 作为 AmqpOutboundEndpoint?
【发布时间】:2015-04-23 16:06:42
【问题描述】:

我对@9​​87654321@ 很陌生。我正在尝试集成一个IntegrationFlow,其端点是AmqpOutboundEndpoint

return IntegrationFlows.from("ordersChannel")
            .handle(Amqp.outboundAdapter(rabbitTemplate)
                    .exchangeName(exchangeName)
                    .routingKey(routingKey))
            .get();

我的MessageGateway 使用我想要的有效负载创建org.springframework.messaging.support.GenericMessage 类型的实例:

@MessagingGateway
public interface OrderDispatchService {


    @Gateway(requestChannel = "ordersChannel")
    void sendOrder(final Order order);
}

我确实希望 outboundEndpoint 创建 amqp 消息,就像 RabbitMessagingTemplate 一样。 org.springframework.messaging.support.GenericMessage 看起来像 amqp 消息。 但是AmqpOutboundEndpoint 只是将AmqpTemplate 作为参数。我怎样才能做到这一点?任何转换原始消息的尝试都会失败,因为端点只是简单地解包消息并获取原始有效负载。也许我偏离了轨道?

更新:

我现在做了以下事情:

.enrichHeaders(s -> s.headerExpressions(h -> h
                    .put(AmqpHeaders.MESSAGE_ID, "headers.id.toString()")
                    .put(AmqpHeaders.TIMESTAMP, "new java.util.Date(headers.timestamp)")))

这会将原始 org.springframework.messaging.support.GenericMessage 标头的值复制到等效的 amqp 标头。

【问题讨论】:

    标签: spring-integration spring-amqp


    【解决方案1】:

    不清楚你的意思; RabbitMessagingTemplate 执行与 AmqpOutboundEndpoint 类似的功能 - 将 o.s.messaging.Message 转换为 RabbitMQ 消息。

    两者都在封面下使用RabbitTemplate

    RabbitMessagingTemplate 适用于使用 spring-messaging 但不使用 Spring Integration 的人。

    如果您能准确解释您的问题是什么,我们可以提供进一步的帮助。

    【讨论】:

    • RabbitMessagingTemplate 创建一个与原始 o.s.messaging.Message 相同的 RabbitMQ 消息。但是AmqpOutboundEndpoint 创建的消息只包含o.s.messaging.Message 的原始有效负载。而且我想使用 spring-integration 进行消息处理/创建,并能够使用出站通道适配器到 rabbitMQ 发送/转换o.s.messaging.Messages,就像RabbitMessagingTemplate 一样。我希望我能更好地解释我的问题。
    • 我不确定您所说的“相同”是什么意思;一个是o.s.m.Message,另一个是rabbitmq 消息,因此它们不能“相同”;也许您在谈论标头映射; Spring Integration 默认情况下不映射用户定义的标头,但您可以通过在流定义中添加 .mappedRequestHeaders("*") 来指示它这样做。
    • 是的,我说的是标头,amqp 消息包含o.s.messaging.message 标头idtimestamp 如果由RabbitMessagingTemplate 转换,则开箱即用。
    • 集成 DefaultAmqpHeaderMapper 不映射这些标头;您需要创建映射器的子类才能这样做。从历史上看,这些标头一直是 SI 内部的,当 o.s.messaging 支持添加到 Spring AMQP 时,它们可能不应该被泄露。如果您认为我们应该为 SI 添加一个选项以提供与RabbitMessagingTemplate 兼容的映射,请随时打开JIRA issue
    • 很高兴知道这一点。我将通过子类化标头映射器来尝试该选项。而且,也许,如果我更深入地研究 Spring 集成,我会考虑一个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2019-07-13
    • 2017-10-30
    • 2016-02-21
    • 2018-06-12
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多