gpt4 book ai didi

spring-integration - Spring Integration 中的不可变消息

转载 作者:行者123 更新时间:2023-12-04 15:07:12 28 4
gpt4 key购买 nike

我想知道在 Spring Integration 中使消息不可变的原因是什么。

仅仅是因为多线程环境中的线程安全吗?

表现?当您每次要向现有消息添加某些内容时都必须创建新消息时,您不会受到性能惩罚吗?

在通过引用传递时避免一系列错误?
这里只是猜测。

最佳答案

最简单的解释方式来自原文Java Immutable Objects idea :

Immutable objects are particularly useful in concurrent applications. Since they cannot change state, they cannot be corrupted by thread interference or observed in an inconsistent state.



既然我们在这里谈论消息传递,我们应该始终牢记 Loose coupling principle生产者(调用者)和消费者(执行者)对彼此一无所知,他们仅通过消息(事件、命令、包等)进行通信。同时同一条消息可能有多个消费者执行完全不相关的业务逻辑。因此,支持事件对象的不可变状态,我们不会影响另一个进程。当我们单独执行消息时,这也可能是进程之间安全性的一部分。

Spring Integration 是真正的纯 Java,因此任何并发性和安全性限制也只是简单地应用在这里,您会惊讶地将消息分发到不同的独立进程,并在另一个进程中看到一个进程的修改。

Reference Manual里面有一些信息:

Therefore, when a Message instance is sent to multiple consumers (e.g. through a Publish Subscribe Channel), if one of those consumers needs to send a reply with a different payload type, it will need to create a new Message. As a result, the other consumers are not affected by those changes.



如您所见,申请的是 Message对象本身及其 MessageHeaders . payload完全由您负责,我过去确实在向 ArrayList 添加和删除元素时遇到了一些问题。多线程业务逻辑中的有效负载。

无论如何,框架建议妥协: MutableMessage , MutableMessageHeadersMutableMessageBuilder .您还可以全局覆盖 MessageBuilder在框架内部使用到 MutableMessageBuilderFactory .为此,您只需要使用 bean 名称 IntegrationUtils.INTEGRATION_MESSAGE_BUILDER_FACTORY_BEAN_NAME 注册这样一个 bean。 :
@Bean(name = IntegrationUtils.INTEGRATION_MESSAGE_BUILDER_FACTORY_BEAN_NAME)
public static MessageBuilderFactory mutableMessageBuilderFactory() {
return new MutableMessageBuilderFactory();
}

并且您的集成流中的所有消息都是可变的并提供相同的 idtimestamp标题。

关于spring-integration - Spring Integration 中的不可变消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48163978/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com