2010-03-08 74 views
2

我必須進行批處理才能使業務流程自動化。我必須定期輪詢目錄以檢測新文件並進行處理。在處理舊文件時,新文件可以進入。現在,我使用quartz調度程序和線程同步來確保只有一個線程可以處理文件。代碼目錄輪詢的最佳做法

部分爲:

應用程序的context.xml

<bean id="methodInvokingJob" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><br/> 
    <property name="targetObject" ref="documentProcessor" /><br/> 
    <property name="targetMethod" value="processDocuments" /><br/> 
</bean> 

DocumentProcessor
.....

public void processDocuments() { 
    LOG.info(Thread.currentThread().getName() + " attempt to run."); 
    if (!processing) { 
    synchronized (this) { 
     try { 
      processing = true; 
      LOG.info(Thread.currentThread().getName() + " is processing"); 
      List<String> xmlDocuments = documentManager.getFileNamesFromFolder(incomingFolderPath);    
      // loop over the files and processed unlock files. 
      for (String xmlDocument : xmlDocuments) { 
       processDocument(xmlDocument); 
      } 
     } 
     finally { 
      processing = false; 
     } 
    } 
    } 
} 

對於當前的代碼,當一個線程正在處理時,我必須阻止其他線程處理文件。這是一個好主意嗎 ?或者我們支持多線程處理。在那種情況下,我怎麼知道哪些文件正在處理以及哪些文件剛剛到達?任何想法真的很感激。

+1

您標記這個C#,但你的代碼看起來像Java。請確保您指定了正確的語言和操作系統。 – Gabe 2010-03-08 10:30:53

+0

它看起來像其他人錯誤地放在C#標記,所以我改變它爲Java。不過,我們需要知道操作系統才能給出有用的答案。 – Gabe 2010-03-08 11:01:17

+0

感謝gabe,它是在java中的批處理。你如何格式化代碼? – 2010-03-08 17:15:35

回答

2

我會做到以下幾點:

  • 一個線程,得到您的文件名,並將它們添加到同步隊列。

  • 執行實際讀取的多個線程:從同步隊列獲取項目並處理它。

要檢查一個文件是否被使用,你可以簡單地嘗試重命名/移動它。

+0

我們做了這樣的事情。 我們還保存在內存緩存中,以檢查當前正在使用哪些文件 – 2014-12-12 10:10:57

5

我會用這些零件構建它:

  1. Castle Transactions with TxF
  2. FileSystemWatcherJavaVersion
  3. 的TransactionScope(沒有java版,除非你砍了很多)
  4. A lock-free queue *(論文討論PERF的Java與.Net,可能能夠得到源from them for JavaJava lock-based queues

    使得:

當有一個新的文件,該文件系統觀察檢測到它(記得把正確的標誌,處理錯誤條件,並設置Enbled < - 真並觀看了雙打),看跌期權隊列中的文件路徑。

您有一個應用程序線程,n個工作線程。如果這是唯一的應用程序,它們會在隊列中旋轉等待TryDequeue,否則它們會在監視器上同時阻止(!Monitor.Enter(has_items));

當一個工作線程通過出隊操作獲得一條路徑時,它開始對其進行處理,現在沒有其他線程可以對其進行處理。如果有輸出雙擊(取決於您的設置),則可以在編寫輸出文件時使用文件事務。如果Commit操作失敗,那麼您知道另一個線程已經寫入輸出文件,並繼續輪詢隊列。

+0

感謝Henrik提供的信息,所有提到的庫對我來說都是全新的,但我必須確保交易,所以我將考慮TxF。目前,我打算使用Spring Batch + Spring Integration。我只是通過介紹和一些演示來閱讀,但他們都相信我這是正確的解決方案。 – 2010-03-08 17:35:29