对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
控制总线
正如 Enterprise Integration Patterns (EIP) 一书中所述,控制总线背后的思想是,与用于“应用程序级”消息传递相同的消息传递系统可用于监视和管理框架内的组件。 在 Spring Integration 中,我们基于上述适配器进行构建,以便您可以发送消息作为调用公开作的一种方式。
以下示例显示如何使用 XML 配置控制总线:
<int:control-bus input-channel="operationChannel"/>
控制总线有一个输入通道,可以访问该通道以调用应用程序上下文中对 bean 的作。 它还具有服务激活终结点的所有公共属性。 例如,如果作结果具有要发送到下游通道的返回值,则可以指定输出通道。
控制总线在输入通道上作为 Spring Expression Language (SpEL) 表达式运行消息。
它接受一条消息,将正文编译为表达式,添加一些上下文,然后运行它。
默认上下文支持任何已使用@ManagedAttribute
或@ManagedOperation
.
它还支持 Spring 的Lifecycle
接口(及其Pausable
扩展,从 5.2 版开始),并且它支持用于配置 Spring 的几个TaskExecutor
和TaskScheduler
实现。
确保控制总线可以使用您自己的方法的最简单方法是使用@ManagedAttribute
或@ManagedOperation
附注。
由于这些注释也用于将方法公开给 JMX MBean 注册表,因此它们提供了一个方便的副产品:通常,您想要向控制总线公开的相同类型的作对于通过 JMX 公开是合理的)。
应用程序上下文中任何特定实例的解析都是在典型的 SpEL 语法中实现的。
为此,请为 bean 名称提供 bean 名称和 bean 的 SpEL 前缀 ()。
例如,要在 Spring Bean 上执行方法,客户端可以向作通道发送消息,如下所示:@
Message operation = MessageBuilder.withPayload("@myServiceBean.shutdown()").build();
operationChannel.send(operation)
表达式上下文的根是Message
本身,因此您还可以访问payload
和headers
作为表达式中的变量。
这与 Spring Integration 端点中的所有其他表达式支持一致。
使用 Java 注释,您可以按如下方式配置控制总线:
@Bean
@ServiceActivator(inputChannel = "operationChannel")
public ExpressionControlBusFactoryBean controlBus() {
return new ExpressionControlBusFactoryBean();
}
同样,您可以按如下方式配置 Java DSL 流定义:
@Bean
public IntegrationFlow controlBusFlow() {
return IntegrationFlow.from("controlBus")
.controlBus()
.get();
}
如果您更喜欢将 lambda 与 automatic 一起使用DirectChannel
创建时,您可以按如下方式创建控制总线:
@Bean
public IntegrationFlow controlBus() {
return IntegrationFlowDefinition::controlBus;
}
在这种情况下,通道名为controlBus.input
.