我编写了一个Kettle作业,将文件从Pentaho 5.3(SP201505)JCR文件夹移动到Windows文件系统文件夹(在同一台服务器上; Server 2008 R2 Enterprise)。 "移动"部分工作使用复制文件步骤,并选择删除源文件选项。
最初作业按预期运行,将所有文件从源JCR文件夹移动到目标文件系统文件夹。
在此作业再次运行之前,Pentaho用户已将新文件放入源JCR文件夹中。但是,当我下次运行此作业时,它不会再看到源JCR文件夹中的任何文件,即使我可以在PUC中浏览它们。
我在Spoon中运行这项工作(编码和测试时)。它使用VFS协议 jcr-solution 来访问JCR文件夹中的文件。
这项工作是否需要在每次运行时进行某种存储库刷新以查看对JCR文件夹的更改,如果是,那么在作业中如何完成?
答案 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);
}
}
上述解决方案似乎解决了我的问题。