Spring integration SpringIntegrationServiceActivator基于输入使用bean名称

Spring integration SpringIntegrationServiceActivator基于输入使用bean名称,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,我正在使用SpringIntegrationDSL创建一个管道,以丰富和持久化从kafka到DB的事件。可以有多种事件类型,我们已经创建了一个事件接口和相应的实现类 事件接口有方法定义-parse()、process()、persist(),实现类有实现 @Bean public IntegrationFlow baseEventFlow() { return IntegrationFlows.from(Kafka.messageDrivenChanne

我正在使用SpringIntegrationDSL创建一个管道,以丰富和持久化从kafka到DB的事件。可以有多种事件类型,我们已经创建了一个事件接口和相应的实现类

事件接口有方法定义-parse()、process()、persist(),实现类有实现

@Bean
    public IntegrationFlow  baseEventFlow() {
                return IntegrationFlows.from(Kafka.messageDrivenChannelAdapter(kafkaListenerContainer))
                        .wireTap(WIRE_TAP_CHNL) // Log the raw messaged
                        .handle(eventDispatch, "preProcess") 
                        .handle(eventDispatch, "dispatch") //identify the implementation class from the event name
                        .handle(???,"parse")  //get the classname from the above handler and then invoke methods
                        .handle(???,"validate")
                        .get();
.handle(eventDispatch,“dispatch”)->在运行时给出实现类名


当我在运行时根据一些输入事件获取类时,如何调用该类名上的方法?您可以将该对象从
dispatch
存储到标头中。下一个
handle()
可以获取该头,转换到公共接口,并针对
负载调用适当的方法。这确实是一种战略模式。使用静态处理程序对象定义确实无法做到这一点

更新

你能提供一个例子供参考吗

没有这样的例子,因为用例超出了标准组件行为。您的任务是该领域一百万(或更多?)可能的业务需求之一。我们的样品中肯定不能全部包括在内

不管怎样,我就是这么想的:

.enrichHeaders(h -> h.headerFunction("handler", eventDispatch::dispatch))
.handle((p, h) -> ((EventProcessor) h.get("handler")).parse(p))
.handle((p, h) -> ((EventProcessor) h.get("handler")).validate(p))

您可以将
dispatch
中的对象存储到标头中。下一个
handle()
可以获取该头,转换到公共接口,并针对
负载调用适当的方法。这确实是一种战略模式。使用静态处理程序对象定义确实无法做到这一点

更新

你能提供一个例子供参考吗

没有这样的例子,因为用例超出了标准组件行为。您的任务是该领域一百万(或更多?)可能的业务需求之一。我们的样品中肯定不能全部包括在内

不管怎样,我就是这么想的:

.enrichHeaders(h -> h.headerFunction("handler", eventDispatch::dispatch))
.handle((p, h) -> ((EventProcessor) h.get("handler")).parse(p))
.handle((p, h) -> ((EventProcessor) h.get("handler")).validate(p))

感谢Artem,您能提供一个参考示例吗?另一个选项是将所有
parse()
方法放在一个bean中,将所有
validate()
方法放在另一个bean中。框架将根据有效负载类型选择适当的方法(只要没有歧义)。请参阅我答案中的更新。感谢Artem,您可以提供一个参考示例吗?另一个选项是将所有
parse()
方法放在一个bean中,将所有
validate()
方法放在另一个bean中。框架将根据负载类型选择适当的方法(只要没有歧义)。