如何启动将在java中按顺序运行的三个任务?
发布时间:2020-12-15 04:37:29 所属栏目:Java 来源:网络整理
导读:我正在尝试启动三个任务:第一个将读取一些电子邮件,在完成一项服务后,根据这些电子邮件生成一些图表将开始,最后这些图表将作为zip文件发送到电子邮件中. 这些任务必须以这种精确的顺序运行: dataReader – graphGenerator – emailSender. 我实现了这项服
我正在尝试启动三个任务:第一个将读取一些电子邮件,在完成一项服务后,根据这些电子邮件生成一些图表将开始,最后这些图表将作为zip文件发送到电子邮件中.
这些任务必须以这种精确的顺序运行: dataReader – > graphGenerator – > emailSender. 我实现了这项服务,但我不明白为什么它不起作用. @Component public class WeeklyEmailService { @Autowired private EmailSender emailSender; @Autowired private GraphGenerator graphGenerator; @Autowired private DataReader dataReader; @Autowired private CompanyRepository companyRepository; @Autowired private EmailConfigurer emailConfigurer; @Value("${mail.username}") private String username; @Value("${mail.password}") private String password; public void sendWeeklyEmail() { emailConfigurer.setUsername(username); emailConfigurer.setPassword(password); if (emailConfigurer.configure() != null) { System.out.println("Connection successfully established with mail server!"); } Task<Void> reader = new Task<Void>() { @Override protected Void call() throws Exception { dataReader.readWeeklyEmails(); return null; } }; Task<Void> generator = new Task<Void>() { @Override protected Void call() throws Exception { companyRepository.getCompanyNames().forEach(company -> { graphGenerator.generateGraphs(new DateTime().minusWeeks(1),new DateTime(),company); }); return null; } }; Task<Void> emailTask = new Task<Void>() { @Override protected Void call() throws Exception { emailSender.sendMailWithAttachment(); return null; } }; reader.setOnSucceeded(event -> { Thread generatorThread = new Thread(generator); generatorThread.start(); }); generator.setOnSucceeded(event -> { Thread emailThread = new Thread(emailTask); emailThread.start(); }); emailTask.setOnSucceeded(event -> { if (clean()) { System.out.println("Graphs Reports and ZIP files deleted from your computer"); } else { System.out.println("Files which you want to delete do not exists"); } }); Thread readerThread = new Thread(reader); readerThread.start(); } private boolean clean() { boolean cleaned = false; try { cleaned = Files.deleteIfExists(Paths.get("graphs")); cleaned = Files.deleteIfExists(Paths.get("reports")); cleaned = Files.deleteIfExists(Paths.get("zip")); } catch (IOException e) { e.printStackTrace(); } return cleaned; } } 如果有更好的方法,请告诉我,谢谢! 解决方法
这里有一些导致相同行为的代码:
简化,完美有序,但没有错误处理. Thread sendWeeklyEmailThread = new Thread(new Runnable(){ public void run() { readWeeklyEmails(); generateGraphs(); sendMailWithAttachment(); clean(); //cleanup.... } }); sendWeeklyEmailThread.start(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |