我正在尝试使用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 方法?
答案 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
。