Spring Integration Service Activator使用基于输入的Bean名称

时间:2019-07-20 00:02:16

标签: spring-integration spring-integration-dsl

我正在使用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”)->在运行时给出实现类名称

当我在运行时根据某些输入事件获取该类时,如何在该类名称上调用方法

1 个答案:

答案 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))