2015-06-05 5 views
1

Я написал приложение Kettle, которое перемещает файлы из папок JCR Pentaho 5.3 (SP201505) в папки файловой системы Windows (на том же сервере; Server 2008 R2 Enterprise). Часть «перемещения» задания использует команду «Копировать файлы» с помощью Исключить исходные файлы.PDI Job Sees Непоследовательный JCR-контент

Первоначально задание выполняется, как ожидается, перемещая все файлы из исходных папок JCR в папки файловой системы целевого назначения.

Перед повторным запуском этой задачи пользователи Pentaho поместили новые файлы в исходные папки JCR. Однако, когда я запускаю это задание, он больше не видит файлы в исходных папках JCR, хотя я могу просматривать их из PUC.

Я выполняю задание изнутри Spoon (при кодировании и тестировании). Он использует протокол VFS jcr-solution для доступа к файлам в папках JCR.

Должна ли эта работа выполнять какое-то обновление репозитория при каждом запуске, чтобы увидеть изменения в папках JCR, и если да, то как это было бы сделано в задании?

ответ

0

По-видимому, несколько экземпляров файловой системы JCR не являются динамически когерентными.

Реверсированный плагин Синхронизатор репозитория Pentaho и выяснили, как обновить локальный экземпляр 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:[email protected]: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); 
    } 
} 

выше решение, кажется, решить мою проблему.