1

我编写了一个 Kettle 作业,将文件从 Pentaho 5.3 (SP201505) JCR 文件夹移动到 Windows 文件系统文件夹(在同一台服务器上;Server 2008 R2 Enterprise)。作业的“移动”部分使用选中了删除源文件选项的复制文件步骤。

最初,作业按预期运行,将所有文件从源 JCR 文件夹移动到目标文件系统文件夹。

在此作业再次运行之前,Pentaho 用户已将新文件放入源 JCR 文件夹中。但是,当我下次运行此作业时,它不再看到源 JCR 文件夹中的任何文件,即使我可以从 PUC 中浏览它们。

我在 Spoon 中运行这项工作(在编码和测试时)。它使用 VFS 协议jcr-solution来访问 JCR 文件夹中的文件。

该作业是否需要在每次运行时进行某种存储库刷新以查看对 JCR 文件夹的更改,如果需要,如何在作业中完成此操作?

4

1 回答 1

0

显然,JCR 文件系统的多个实例不是动态一致的。

我对插件Pentaho Repository Synchronizer进行了逆向工程,并弄清楚了如何刷新 JCR 的本地实例。可以通过 PDI 转换步骤User Defined Java Class中的以下代码段来完成刷新。此代码期望文件系统根 URI 位于名为RootURI的输入字段中:

import org.apache.commons.vfs.FileObject;
import org.pentaho.di.core.vfs.KettleVFS;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
    try
    {
        // Get a row from the input hop.
        Object[] r=getRow();

        // Are we are done?
        if (r==null) 
        {
            // Yes.
            setOutputDone();
            return false;
        }

        // No, pick up the file system root URI from a field named RootURI.
        // RootURI example: "jcr-solution:http://admin:password@localhost:8080/pentaho!/"
        String fileName=get(Fields.In,"RootURI").getString(r);

        // Get the file system object and close it.
        FileObject jcrObject=KettleVFS.getFileObject(fileName);
        if ((jcrObject!=null)&&(jcrObject.exists()))
        {
            KettleVFS.getInstance().getFileSystemManager().closeFileSystem(jcrObject.getFileSystem());
            KettleVFS.getInstance().getFileSystemManager().getFilesCache().close();
            //System.out.println("*** JCR Refreshed ***");
        }

        return true;

    }
    catch (Exception e)
    {
        throw new KettleException(e);
    }
}

上面的解决方案似乎已经解决了我的问题。

于 2015-06-08T21:45:59.800 回答