PDI工作看到不一致的JCR内容

时间:2015-06-05 23:54:22

标签: pentaho kettle pdi

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我反向设计了插件 Pentaho Repository Synchronizer ,并想出了如何刷新我的本地JCR实例。可以通过PDI转换步骤用户定义的Java类中的以下代码段完成刷新。此代码要求文件系统根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);
    }
}

上述解决方案似乎解决了我的问题。