Spring integration SpringIntegrationServiceActivator基于输入使用bean名称
我正在使用SpringIntegrationDSL创建一个管道,以丰富和持久化从kafka到DB的事件。可以有多种事件类型,我们已经创建了一个事件接口和相应的实现类 事件接口有方法定义-parse()、process()、persist(),实现类有实现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
@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中。框架将根据负载类型选择适当的方法(只要没有歧义)。