2016-07-06 3699 views
0

我试图使用spring集成实现注释驱动事件总线(例如Guava Event Bus)。 我有一个发布订阅通道我在那里发布我的活动,其想法是使用注解为@ServiceActivator的方法作为事件处理程序。 每种方法都可以根据需要处理的事件(有效负载)拥有不同的签名。多个@ServiceActivator方法具有相同的inputChannel和不同的签名

我注意到的是,当事件被发布,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

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

如果你想过滤器意外的类型,你一定要使用@Filter之前你的@ServiceActivator。换句话说,您的操作与现在一样,但要使用前面的过滤器作为PublishSubscribeChannel的订阅者,您的流程有点复杂。

你甚至可以依靠现有PayloadTypeSelector

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

或者说,是的,它检查​​类型并标有相同@Filter只是简单的POJO方法。

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

只是不要混淆担心。服务激活器用于目标业务逻辑中的Message处理。为了过滤和跳过,我们有一个不同的EI模式 - filter

+0

好的,谢谢你,我误解了这种模式。我会想象,同样的理性适用于网关。也就是说,所有使用“@Gateway”注解的方法都是订阅相同的requestChannel,并且必须使用相同的有效内容。我对么? –

+0

请注意,如果同一类中有多个方法具有不同的签名,则框架将调用匹配有效负载的方法 - 只要它们是唯一且明确的。没有;具有不同签名的多个网关方法可以发布到相同的频道。 –

+0

'@网关'是一个完全不同的故事。它不是关于*订阅*,而是*发布*。 'requestChannel'用于通过网关的方法调用发送消息。对于不同的'@ Gateway',这可以是相同的频道,但是您应该确切地将它们的参数计为发送消息的'payload'。 –

相关问题