如何覆盖 mule SFTP 端点的默认行为?

How to override default behavior of mule SFTP endpoint?

我需要覆盖 mule SFTP 入站端点的默认行为。我有骡子流从 SFTP 位置选择文件并进行一些交替并发送到第三方服务。我在文件上传中没有控制器。所以同一时间可能有多个文件。

我需要在那里实施节流机制。例如:Mule flow 需要在一次投票中选择最旧的 10 个文件。所以我打算覆盖 mule SFTP 客户端的默认行为来实现这一点。我正在使用 JAVA.

您可以利用 Transport Service Override: implement your own SftpMessageReceiver 并配置您的 SFTP 连接器以使用此自定义组件,例如:

<sftp:connector name="sftp-connector" ... />
    ...
    <service-overrides messageReceiver="com.mycomp.MySftpMessageReceiver" />
</sftp:connector>

我建议您覆盖每个找到的文件的 poll() function of the existing receiver for the Mule version you are using. For Mule 3.9 it will retrieve all files and call routeFile()。您可以实现自己的 poll(),它会选择 10 个最近的文件并重现相同的行为。我不会在这里提供完整的代码示例,但您可以从现有功能(检索、锁定、路由)中获取灵感来实现您自己的功能。例如:

public class MySftpMessageReceiver extends SftpMessageReceiver {
    ...
    @Override
    public void poll() throws Exception {
        //poll 10 oldest files
        //...
        //route them
        for (String file : files){
            //...
            routeFile(file);
        }
    }
    ...
}

请注意,覆盖现有的 SftpMessageReceiver 只是一种可行的方法。这个想法是实现您自己的 MessageReceiver 并使用如上所述的服务覆盖。

编辑:根据@NNishanthi Wickramasinghe 请求检索私有 SftpReceiverRequesterUtil:您可以创建自己的实例或检索由超级构造函数创建的实例。

查看代码,您可以看到它是使用受保护的 createSftpReceiverRequesterUtil() 函数创建的,并受构造函数影响到私有字段。您可以在自己的构造函数中调用此函数来复制此行为,或者为避免重复覆盖此方法以检索实例化对象并将其影响到您自己的字段,例如:

private SftpReceiverRequesterUtil sftpRRUtil = null;
...
@Override
protected SftpReceiverRequesterUtil createSftpReceiverRequesterUtil(InboundEndpoint endpoint) {
    sftpRRUtil = super.createSftpReceiverRequesterUtil(endpoint);
    return sftpRRUtil;
 }