此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
消息传递元注释
从 V4.0 开始,所有消息传递注释都可以配置为元注释,并且所有用户定义的消息传递注释都可以定义相同的属性来覆盖其默认值。 此外,元注释可以分层配置,如以下示例所示:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ServiceActivator(inputChannel = "annInput", outputChannel = "annOutput")
public @interface MyServiceActivator {
String[] adviceChain = { "annAdvice" };
}
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@MyServiceActivator
public @interface MyServiceActivator1 {
String inputChannel();
String outputChannel();
}
...
@MyServiceActivator1(inputChannel = "inputChannel", outputChannel = "outputChannel")
public Object service(Object payload) {
...
}
分层配置元注释允许用户为各种属性设置默认值,并允许将框架 Java 依赖项隔离到用户注释,从而避免在用户类中使用它们。 如果框架找到具有具有框架元注释的用户注释的方法,则将其视为直接使用框架注释注释该方法。
注释@Bean
方法
从 4.0 版开始,您可以在@Bean
方法定义@Configuration
类,以基于 bean(而不是方法)生成消息端点。
当以下情况时,它很有用@Bean
定义是“开箱即用”MessageHandler
实例 (AggregatingMessageHandler
,DefaultMessageSplitter
等),Transformer
实例 (JsonToObjectTransformer
,ClaimCheckOutTransformer
等),以及MessageSource
实例 (FileReadingMessageSource
,RedisStoreMessageSource
等)。
以下示例演示如何将消息传递注释与@Bean
附注:
@Configuration
@EnableIntegration
public class MyFlowConfiguration {
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<String> consoleSource() {
return CharacterStreamReadingMessageSource.stdin();
}
@Bean
@Transformer(inputChannel = "inputChannel", outputChannel = "httpChannel")
public ObjectToMapTransformer toMapTransformer() {
return new ObjectToMapTransformer();
}
@Bean
@ServiceActivator(inputChannel = "httpChannel")
public HttpRequestExecutingMessageHandler httpHandler() {
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://foo/service");
handler.setExpectedResponseType(String.class);
handler.setOutputChannelName("outputChannel");
return handler;
}
@Bean
@ServiceActivator(inputChannel = "outputChannel")
public LoggingHandler loggingHandler() {
return new LoggingHandler("info");
}
}
5.0 版引入了对@Bean
注释为@InboundChannelAdapter
返回java.util.function.Supplier
,它可以生成 POJO 或Message
.
以下示例演示如何使用该组合:
@Configuration
@EnableIntegration
public class MyFlowConfiguration {
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
return () -> "foo";
}
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<Message<String>> messageSupplier() {
return () -> new GenericMessage<>("foo");
}
}
元注释规则适用于@Bean
方法(@MyServiceActivator
前面描述的注释可以应用于@Bean
定义)。
当您在消费者上使用这些注释时@Bean 定义,如果 Bean 定义返回适当的MessageHandler (取决于注释类型),您必须设置属性(例如outputChannel ,requiresReply ,order 等),在MessageHandler @Bean 定义本身。
仅使用以下注释属性:adviceChain ,autoStartup ,inputChannel ,phase 和poller .
所有其他属性都用于处理程序。 |
Bean 名称是使用以下算法生成的: |
-
这
MessageHandler
(MessageSource
)@Bean
从方法名称中获取自己的标准名称或name
属性@Bean
. 这就像@Bean
方法。 -
这
AbstractEndpoint
bean name 使用以下模式生成:[@Bean name].[decapitalizedAnnotationClassShortName]
. 例如,SourcePollingChannelAdapter
endpoint 的consoleSource()
前面显示的定义的 bean 名称为consoleSource.inboundChannelAdapter
. 与 POJO 方法不同,Bean 方法名称不包含在端点 Bean 名称中。 另请参阅端点 Bean 名称。 -
如果
@Bean
不能直接在目标端点中使用(不是MessageSource
,AbstractReplyProducingMessageHandler
或AbstractMessageRouter
),分别AbstractStandardMessageHandlerFactoryBean
已注册以委托此@Bean
. 此包装器的 bean 名称是使用以下模式生成的:[@Bean name].[decapitalizedAnnotationClassShortName].[handler (or source)]
.
在@Bean 定义,则inputChannel 必须引用声明的 bean。
如果应用程序上下文中尚不存在通道,则会自动声明通道。 |
使用 Java 配置,您可以使用任何
与现有的 Spring 容器逻辑一起,消息传递端点 bean(基于 |
创建带有注释的桥梁
从 4.0 版开始,Java 配置提供了@BridgeFrom
和@BridgeTo
@Bean
要标记的方法注释MessageChannel
豆子在@Configuration
类。
这些确实是为了完整性而存在的,提供了一种方便的机制来声明BridgeHandler
及其消息端点配置:
@Bean
public PollableChannel bridgeFromInput() {
return new QueueChannel();
}
@Bean
@BridgeFrom(value = "bridgeFromInput", poller = @Poller(fixedDelay = "1000"))
public MessageChannel bridgeFromOutput() {
return new DirectChannel();
}
@Bean
public QueueChannel bridgeToOutput() {
return new QueueChannel();
}
@Bean
@BridgeTo("bridgeToOutput")
public MessageChannel bridgeToInput() {
return new DirectChannel();
}
您也可以将这些注释用作元注释。
为带注释的端点提供建议
请参阅使用注释通知端点。