我正在使用Spring Integration dsl创建一个管道,以丰富和持久化从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”)->在运行时给出实现类名称
当我在运行时根据某些输入事件获取该类时,如何在该类名称上调用方法
答案 0 :(得分:2)
您可以将该对象从dispatch
存储到标题中。下一个handle()
可以获取该标头,并将其转换为通用接口,然后针对payload
调用适当的方法。这确实是一种战略模式。您真的不能使用静态处理程序对象定义来做到这一点。
更新
能否请您提供示例以供参考
没有这样的示例,因为用例超出了标准组件的行为。您的任务是该领域中数百万(或更多)个可能的业务需求之一。我们绝对不能在样本中涵盖所有这些内容。
无论如何,这就是我的想法:
.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))