多个@ServiceActivator方法具有相同的inputChannel和不同的签名

时间:2016-07-06 11:26:03

标签: spring-integration

我正在尝试使用spring集成实现注释驱动的事件总线(例如Guava Event Bus)。 我有一个 PublishSubscribeChannel ,我在其中发布我的事件,其目的是使用带有 @ServiceActivator 注释的方法作为事件处理程序。 每种方法都可以根据需要处理的事件(有效负载)使用不同的签名。

我注意到,在发布事件时,会调用由 ServiceActivatorAnnotationPostProcessor 创建的 ServiceActivatingHandler 所有实例,并且每个签名与有效负载不匹配的方法。例如。

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method handle(model.api.ServiceAvailableEvent) cannot be found on service.eai.TestServiceActivatorImpl2 type

有没有办法只针对特定的有效负载类型定义 @ServiceActivator 方法?

1 个答案:

答案 0 :(得分:0)

这是正确的,PublishSubscribeChannel的所有订阅者都接受相同的消息。如果没有任何机会将传入的有效负载转换为预期的方法参数类型,我们就会得到该异常。

如果您想过滤意外类型,则必须在@Filter之前使用@ServiceActivator。换句话说,你就像现在一样,但是使用前置过滤器作为PublishSubscribeChannel的订阅者,使你的流程变得有点复杂。

您甚至可以依赖现有的PayloadTypeSelector

@Bean
@Filter(inputChannel = "publishSubscribeChannel", outputChannel="service1")
public MessageSelector payloadTypeSelector() {
   return new PayloadTypeSelector(...);
}

或者,是的,只是简单的POJO方法,它检查payload类型并标记相同的@Filter

我想你的下一个问题是:@ServiceActivator为什么不忽略那些不适合目标方法的类型?

只是不要混淆顾虑。 Service Activator用于在目标业务逻辑中处理Message。对于过滤和跳过,我们有一个不同的EI模式 - filter