控制总线
正如 Enterprise Integration Patterns (EIP) 一书中描述的,控制总线背后的思想是,可以使用与用于 “应用程序级” 消息传递相同的消息传递系统来监控和管理框架内的组件。 在 Spring 集成中,我们构建在上述适配器的基础上,以便您可以发送消息作为调用公开操作的一种方式。
由于 Control Bus 功能强大,可以更改系统状态,因此建议保护其消息接收(请参阅 ),并将 Control Bus 管理(消息源)仅公开到 DMZ 中。SecurityContextChannelInterceptor |
以下示例说明如何使用 XML 配置控制总线:
<int:control-bus input-channel="operationChannel"/>
控制总线有一个 Importing 通道,可以访问该通道以调用应用程序上下文中的 bean 上的操作。 它还具有服务激活终端节点的所有通用属性。 例如,如果操作结果具有要发送到下游通道的返回值,则可以指定输出通道。
控制总线将输入通道上的消息作为托管操作以简单的字符串格式运行,例如 .
目标方法参数的参数必须在 header 中以列表的形式提供。
Bean 和要调用的方法从基础结构 Bean 中解析。
默认情况下,按需注册命令:其标志可以通过 打开。beanName.methodName
IntegrationMessageHeaderAccessor.CONTROL_BUS_ARGUMENTS
ControlBusCommandRegistry
ControlBusCommandRegistry
eagerInitialization
@EnableIntegrationManagement(loadControlBusCommands = "true")
Control Bus 的功能类似于 JMX,因此命令的方法资格必须满足以下要求:
-
已使用 或
@ManagedAttribute
@ManagedOperation
; -
Spring 的接口(以及自 5.2 版以来的扩展);
Lifecycle
Pausable
-
用于配置多个 Spring 和 implementations.
TaskExecutor
TaskScheduler
确保你自己的方法对 control 总线可用的最简单方法是使用 or 注解。
由于这些注释也用于向 JMX MBean 注册表公开方法,因此它们提供了一个方便的副产品:通常,要向控制总线公开的相同类型的操作对于通过 JMX 公开是合理的。
有关更多信息,请参阅 和 Javadocs。@ManagedAttribute
@ManagedOperation
ControlBusCommandRegistry
ControlBusMethodFilter
要在 Spring Bean 上执行方法,客户端可以向操作通道发送消息,如下所示:
Message<?> operation = MessageBuilder.withPayload("myServiceBean.shutdown").build();
operationChannel.send(operation);
如果要调用的目标方法具有参数(例如 ),则必须将这些值作为 header 提供:ThreadPoolTaskExecutor.setMaxPoolSize(int maxPoolSize)
IntegrationMessageHeaderAccessor.CONTROL_BUS_ARGUMENTS
Message<?> operation =
MessageBuilder.withPayload("myTaskExecutor.setMaxPoolSize")
.setHeader(IntegrationMessageHeaderAccessor.CONTROL_BUS_ARGUMENTS, List.of(10))
.build();
operationChannel.send(operation);
您可以将这些命令视为 JDBC 中具有参数绑定的实例。
参数的类型必须与方法参数的类型匹配。
它们用作附加标准,以根据 Java 方法重载功能选择要调用的方法。
例如,组件:PreparedStatement
@ManagedResource
class TestManagementComponent {
@ManagedOperation
public void operation() {
}
@ManagedOperation(description = "The overloaded operation with int argument")
public void operation(int input) {
}
@ManagedOperation(description = "The overloaded operation with two arguments")
public void operation(int input1, String input2) {
}
@ManagedOperation
public int operation2() {
return 123;
}
}
将公开 3 个带有 name 的命令。
当我们调用 command 时,我们应该为 header 选择一个适当的值列表,以便 过滤掉 bean 上的目标方法。operation
testManagementComponent.operation
IntegrationMessageHeaderAccessor.CONTROL_BUS_ARGUMENTS
ControlBusCommandRegistry
使用 Java 注释,您可以按如下方式配置控制总线:
@Bean
@ServiceActivator(inputChannel = "operationChannel")
public ControlBusFactoryBean controlBus() {
return new ControlBusFactoryBean();
}
同样,您可以按如下方式配置 Java DSL 流定义:
@Bean
public IntegrationFlow controlBusFlow() {
return IntegrationFlow.from("controlBus")
.controlBus()
.get();
}
如果您更喜欢将 lambda 与自动创建结合使用,则可以按如下方式创建控制总线:DirectChannel
@Bean
public IntegrationFlow controlBus() {
return IntegrationFlowDefinition::controlBus;
}
在本例中,通道名为 。controlBus.input
另请参阅 Control Bus REST Controller 以通过 HTTP 公开 Control Bus 管理。