控制总线
正如《企业集成模式》(EIP)一书中所述,控制总线的理念是,用于监控和管理框架内组件的信使系统与用于“应用程序级”消息传递的信使系统相同。在Spring Integration中,我们基于上面描述的适配器构建,以便您可以发送消息作为调用公开操作的一种方式。
以下示例显示了如何使用XML配置控制总线
<int:control-bus input-channel="operationChannel"/>
控制总线有一个输入通道,可以访问该通道以调用应用程序上下文中的bean上的操作。它还具有服务激活端点的所有常见属性。例如,如果操作的结果具有要发送到下游通道的返回值,则可以指定输出通道。
控制总线将输入通道上的消息作为Spring表达式语言(SpEL)表达式运行。它接收一条消息,将消息体编译成表达式,添加一些上下文,然后运行它。默认上下文支持任何使用@ManagedAttribute
或@ManagedOperation
注解的方法。它还支持Spring的Lifecycle
接口(以及自5.2版本以来的Pausable
扩展)上的方法,以及用于配置Spring的几个TaskExecutor
和TaskScheduler
实现的方法。确保您自己的方法可用于控制总线的最简单方法是使用@ManagedAttribute
或@ManagedOperation
注解。由于这些注解也用于将方法公开给JMX MBean注册表,因此它们提供了一个方便的副产品:通常,您想要公开给控制总线的相同类型的操作也适合通过JMX公开)。应用程序上下文内任何特定实例的解析是在典型的SpEL语法中实现的。为此,请使用bean的SpEL前缀(@
)提供bean名称。例如,要在一个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();
}
如果您更喜欢使用带有自动DirectChannel
创建的lambda表达式,则可以如下创建控制总线:
@Bean
public IntegrationFlow controlBus() {
return IntegrationFlowDefinition::controlBus;
}
在这种情况下,通道名为controlBus.input
。