Spring Integration - 在应用程序代码中调用方法

Posted

技术标签:

【中文标题】Spring Integration - 在应用程序代码中调用方法【英文标题】:Spring Integration - Invoking Methods in Application Code 【发布时间】:2015-07-11 17:18:18 【问题描述】:

我有一个outbound-channel-adapter,相关配置如下所示。

<int:outbound-channel-adapter channel="foo-fileChannel" ref="foo-handlerTarget" method="handleFeedFile">
    <int:poller fixed-delay="5000" receive-timeout="1000" max-messages-per-poll="10" />
</int:outbound-channel-adapter>
<int:channel id="foo-fileChannel">
    <int:queue />
</int:channel>


<bean id="foo-handlerTarget" class="com.abc.FooFeedHandlerImpl">
    <property name="fooDescriptorFile" value="$feed.foo.fooDescriptorFile" />
    <property name="fileIdRegex" ref="foo-fileRegex" />
    <property name="processId" value="$feed.processId" />
    <property name="workingLocation" value="$feed.foo.workingLocation" />
    <property name="remoteLocation" value="$feed.foo.remoteLocation" />
    <property name="stalenessThreshold" value="$feed.foo.stalenessThreshold" />
</bean>

而在 FooFeedHandlerImpl...

public void handleFeedFile(File retrievedFile) 
    handleFeedFile(retrievedFile, null);



public void handleFeedFile(File retrievedFile, String processKey) 
    if (isHandlerForFileName(retrievedFile.getName())) 
        processFeed(retrievedFile, processKey);
    

问题:

通道适配器调用哪个 handleFeedFile 方法?

当我使用 Spring 集成在应用程序代码中调用方法时,方法参数是如何确定的?

感谢您的帮助!

编辑:

我在本地运行我的进程(下载了本地 SFTP 服务器 - http://www.coreftp.com/server/index.html)并确定调用了 handleFeedFile(File file) 方法。

【问题讨论】:

目前发生了什么? 【参考方案1】:

您可能想参考F.6 Message Mapping rules and conventions。

在确定适当的映射时,多个参数可能会产生很多歧义。一般建议是使用@Payload 和/或@Header/@Headers 注释您的方法参数。下面是一些导致异常的模棱两可条件的示例。

和:

多种方法:

具有多个方法的消息处理程序根据上述相同的规则进行映射,但是某些场景可能看起来仍然令人困惑。

如果您无法注释您的目标方法,那么您可以使用 SpEL 表达式来调用您想要的方法:

3.3.2 Configuring An Outbound Channel Adapter

与许多其他 Spring Integration 组件一样,它也提供对 SpEL 表达式评估的支持。要使用 SpEL,请通过 'expression' 属性提供表达式字符串,而不是提供用于 bean 上的方法调用的 'ref' 和 'method' 属性。当计算表达式时,它遵循与方法调用相同的约定,其中:每当计算结果为非空值时,an 的表达式将生成一条消息,而 an 的表达式必须等效于返回 void 的方法调用。

【讨论】:

谢谢忍者。在您的帮助下,我肯定对现在发生的事情有了更好的了解。但是,我仍然不确定在我的情况下会调用哪种方法。它看起来与消息映射规则中提供的倒数第二个示例非常相似,例如foo(String str, Map m) vs foo(String str),但我没有收到异常...你知道我的情况的规则吗? 我在调试过程并确定方法后编辑了我的答案。毫不奇怪,只调用了一个参数的方法。就我而言,文件是有效负载,所以我猜 handleFeedFile(File file) 是唯一有效的方法。【参考方案2】:

根据 Spring 集成中的 documentation,在您的情况下,POJO(bean foo-handlerTarget)将使用包含有效负载的 Message 对象调用。你执行过你的代码吗?我希望它会生成一个NoSuchMethodError

你需要一个

public void handleFeedFile(Message<?> message);

方法。

【讨论】:

感谢您的回复。是的,代码已执行。它实际上已经在我们的生产环境中运行了几年,没有出现任何问题。

以上是关于Spring Integration - 在应用程序代码中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring Integration运行时配置

使用 Spring Integration HttpInbound 示例

在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息

XMPP - Spring Integration:spring 应用程序是不是运行嵌入式 XMPP 服务器

Spring Integration 窃听直接 MessageChannel 进行测试

Spring Integration 反应式流支持