我必须进行批处理来自动化业务流程。我必须定期轮询目录以检测新文件并进行处理。当旧文件正在处理时,新文件可以进来。目前,我使用quartz调度程序和线程同步来确保只有一个线程可以处理文件。
部分代码为:
应用程序上下文.xml
<bean id="methodInvokingJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><br/>
<property name="targetObject" ref="documentProcessor" /><br/>
<property name="targetMethod" value="processDocuments" /><br/>
</bean>
文档处理器
.....
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;
}
}
}
}
对于当前的代码,我必须在一个线程正在处理时阻止其他线程处理文件。这是一个好主意吗 ?或者我们支持多线程处理。在这种情况下,我如何知道哪些文件正在处理以及哪些文件刚刚到达?任何想法都非常感激。
我会用这些部分来构建它:
-
Castle 与 TxF 的交易 http://github.com/haf/Castle.Services.Transaction
-
文件系统观察者 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx Java版本 http://jnotify.sourceforge.net/
-
TransactionScope(没有java版本,除非你经常破解它)
-
无锁队列 http://www.bluebytesoftware.com/blog/CommentView,guid,3740daff-a459-4298-bc9b-65d3647f5c0d.aspx*(讨论 perf Java 与 .Net 的论文,也许可以获得源代码来自他们的Java http://ieeexplore.ieee.org/iel5/4283719/4283720/04283864.pdf?arnumber=4283864) Java 基于锁的队列 http://java.sun.com/docs/books/tutorial/collections/implementations/queue.html
这样:
当有新文件时,文件系统观察程序会检测到它(记住放置正确的标志,处理错误条件并设置 Enbled
你有一个应用程序线程,n 个工作线程。如果这是唯一的应用程序,它们会在队列上旋转等待,TryDequeue,否则它们会在监视器上阻塞 while(!Monitor.Enter(has_items)) ;
当工作线程通过出队操作获得路径时,它开始对其进行工作,现在没有其他线程可以对其进行工作。如果存在双倍输出(取决于您的设置),则您可以在写入输出文件时使用文件事务。如果提交操作失败,则您知道另一个线程已经写入输出文件,并恢复轮询队列。
- 竞争条件,请参阅:http://groups.google.com/group/lock-free/browse_thread/thread/c3b83466b27f6372 http://groups.google.com/group/lock-free/browse_thread/thread/c3b83466b27f6372
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)