正在处理一些网络应用程序,我在某些地方受到了打击,我需要你的帮助。 我使用struts framworks开发了一个java Web应用程序。此应用程序从用户获取源文件夹并复制到服务器内的唯一目录中,它将在每个源文件夹上执行批处理,批处理将在各个文件夹内写入日志。 上传和复制源文件夹工作正常但实际问题是并发执行批处理。 当一个用户上传源文件夹并开始批处理执行时,另一个用户也同时上传源文件夹并开始批处理,我需要知道第一个用户批处理何时完成,第二个用户完成。如何跟踪并发线程是否已完成。使用Executor执行程序= Executors.newCachedThreadPool();请在下面找到代码
private class BackgroundTask extends SwingWorker<Integer, String> {
String srcpath;
String log;
BackgroundTask(String path)
{
this.srcpath=path;
}
private int status;
public BackgroundTask() {
}
@Override
protected Integer doInBackground() {
try {
final File batchFile = new File("D://chetan//bin//runner.bat");
ProcessBuilder builder = new ProcessBuilder();
builder.directory(new File(srcpath));
String[] cmd = { "cmd", "/c",batchFile.getAbsolutePath(),"-X"};
for (int x = 0; x < cmd.length; x++) {
System.out.println("Command :" + cmd[x]);
}
builder.command(cmd);
Process process;
process = builder.start();
InputStream is1 = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is1);
BufferedReader br = new BufferedReader(isr);
String line;
File logfile;
File logpath=new File(srcpath+File.separator+"LOG");
if(logpath.isDirectory())
{
logfile=new File(logpath+File.separator+"runner.log");
}
else
{
logpath.mkdir();
logfile=new File(logpath+File.separator+"runner.log");
}
logfile.createNewFile();
while ((line = br.readLine()) != null) {
//appendText(line);
log+=line+"\n";
}
FileUtils.writeStringToFile(logfile,log);
process.getInputStream().close();
process.getOutputStream().close();
process.getErrorStream().close();
process.destroy();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return status;
}
@Override
protected void process(java.util.List<String> messages) {
// statusLabel.setText((this.getState()).toString());
}
@Override
protected void done() {
}
}
第二课
public class RunnerAnalysisAction extends ActionSupport implements SessionAware {
private BackgroundTask backgroundTask;
public String execute() {
String projectRoot="D:\\Sample_DemoProjects\\DEMO_375530\\";
backgroundTask = new BackgroundTask(projectRoot+ProjectName);
Executor executor= Executors.newCachedThreadPool();
executor.execute(backgroundTask);
return SUCCESS;
}
}
上面的代码工作正常,并在相应的源文件夹中创建日志文件,但我需要 知道批处理何时完成任务,因为一旦批处理完成其任务,该应用程序将触发电子邮件 用户使用log.How知道特定任务是否完成。请提供一些示例代码。谢谢。
答案 0 :(得分:0)
您没有指定Web应用程序的性质。如果它没有聚集(运行单个实例),则保留一个静态变量(或 ActionServlet 中的实例变量, singleton )。当前一个用户的线程(工作人员任务)已经运行时,将此变量设置为“true”,并在线程完成时将其重置为false。使用此标志来检查另一个线程(来自另一个用户)是否可以运行 - true表示无法运行,false表示可以运行。或者将ExecutorService定义为共享(静态)实例,然后将其设置为 SingleThreaded 池并向其提交工作者。希望你明白了。
答案 1 :(得分:0)
跟踪我使用java.util.concurrent.Future的并发线程。 Future表示异步计算的结果。提供方法以检查计算是否完成,等待其完成,以及检索计算结果。只有在计算完成时才能使用方法get检索结果,必要时阻塞直到准备就绪。
您可以尝试完整example