如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

控制总线

正如《企业集成模式(EIP)一书中所描述的那样,控制总线的理念是:同一消息系统既可用于监控和管理框架内的组件,也可用于“应用级”消息传递。 在 Spring Integration 中,我们基于上述适配器构建功能,使您能够发送消息以调用已暴露的操作。spring-doc.cadn.net.cn

以下示例展示了如何使用 XML 配置控制总线:spring-doc.cadn.net.cn

<int:control-bus input-channel="operationChannel"/>

控制总线拥有一个输入通道,可用于调用应用上下文中的 Bean 操作。 它还具备服务激活端点的所有通用属性。 例如,如果操作结果包含需要发送到下游通道的返回值,您可以指定一个输出通道。spring-doc.cadn.net.cn

控制总线在输入通道上运行消息,将其作为 Spring 表达式语言 (SpEL) 表达式处理。它接收一条消息,将主体编译为表达式,添加一些上下文,然后运行它。默认上下文支持任何已使用 @ManagedAttribute@ManagedOperation 注解的方法。它同时也支持 Spring 的 Lifecycle 接口上的方法(以及自 5.0 版本起其 Pausable 扩展)。2),它支持用于配置 Spring 的多个 TaskExecutorTaskScheduler 实现的方法。确保自己的方法对控制总线可用的最简单方法是使用 @ManagedAttribute@ManagedOperation 注解。由于这些注解也用于将方法暴露给 JMX MBean 注册表,因此它们提供了一个方便的副产品:通常,您希望向控制总线暴露的同一类操作也合理地适合通过 JMX 进行暴露)。应用上下文中任何特定实例的解析都是通过典型的 SpEL 语法实现的。为此,请为 Bean 提供带有 SpEL 前缀的 Bean 名称(@)。例如,要在 Spring Bean 上执行方法,客户端可以向操作通道发送如下消息:spring-doc.cadn.net.cn

Message operation = MessageBuilder.withPayload("@myServiceBean.shutdown()").build();
operationChannel.send(operation)

表达式的上下文根是 Message 本身,因此您在表达式中也可以将 payloadheaders 作为变量访问。 这与 Spring Integration 端点中的所有其他表达式支持一致。spring-doc.cadn.net.cn

使用 Java 注解,您可以按如下方式配置控制总线:spring-doc.cadn.net.cn

@Bean
@ServiceActivator(inputChannel = "operationChannel")
public ExpressionControlBusFactoryBean controlBus() {
    return new ExpressionControlBusFactoryBean();
}

同样,您可以按如下方式配置 Java DSL 流定义:spring-doc.cadn.net.cn

@Bean
public IntegrationFlow controlBusFlow() {
    return IntegrationFlow.from("controlBus")
              .controlBus()
              .get();
}

如果您更喜欢使用带有自动 DirectChannel 创建的 lambda 表达式,可以按以下方式创建控制总线:spring-doc.cadn.net.cn

@Bean
public IntegrationFlow controlBus() {
    return IntegrationFlowDefinition::controlBus;
}

在这种情况下,通道名称为 controlBus.inputspring-doc.cadn.net.cn