Spring Integration中的不可变消息

sou*_*ser 6 spring-integration

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

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

性能?如果每次要在现有消息中添加内容时必须创建新消息,是否会导致性能下降?

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

Art*_*lan 5

解释这一点的最简单方法来自最初的Java Immutable Objects理念:

不可变对象在并发应用程序中特别有用.由于它们不能改变状态,因此它们不会被线程干扰破坏或在不一致状态下被观察到.

由于我们在这里谈论消息传递,我们应该始终牢记松散耦合原则,其中生产者(调用者)和消费者(执行者)对彼此一无所知,并且他们仅通过消息(事件,命令,包等)进行通信.同时,相同的消息可能有几个消费者执行绝对不相关的业务逻辑.因此,支持活动对象的不可变状态,我们不会影响另一个进程.当我们单独执行消息时,这也可能是进程之间安全性的一部分.

Spring Integration实际上是纯Java,所以任何并发和安全限制也只是简单地应用在这里,你会惊讶地将消息分发给不同的独立进程,并看到另一个进程的修改.

参考手册中有一些信息:

因此,当Message实例被发送给多个消费者时(例如,通过发布订阅频道),如果其中一个消费者需要发送具有不同有效载荷类型的回复,则需要创建新的Message.因此,其他消费者不会受到这些变化的影响.

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

反正框架提出一个折衷方案:MutableMessage,MutableMessageHeadersMutableMessageBuilder.您还可以在MessageBuilder内部全局覆盖Framework中使用的内容MutableMessageBuilderFactory.为此,您只需要使用bean名称注册这样的bean IntegrationUtils.INTEGRATION_MESSAGE_BUILDER_FACTORY_BEAN_NAME:

@Bean(name = IntegrationUtils.INTEGRATION_MESSAGE_BUILDER_FACTORY_BEAN_NAME)
public static MessageBuilderFactory mutableMessageBuilderFactory() {
    return new MutableMessageBuilderFactory();
}
Run Code Online (Sandbox Code Playgroud)

而在你的集成流程的所有邮件将是可变的,并提供相同idtimestamp头.