【问题标题】:Load email using javax.mail使用 javax.mail 加载电子邮件
【发布时间】:2015-04-23 08:22:16
【问题描述】:

我正在使用 java.mail jar 文件版本 1.4.7

我创建了一个 Window 的调度程序来从电子邮件服务器加载电子邮件。此调度程序每 7 分钟运行一次。在代码的最后,对于那些已加载的电子邮件,系统将从电子邮件服务器中删除它们。

这应该可以工作,但如果前一个实例加载电子邮件的时间超过 7 分钟,另一个新实例可能会加载相同的电子邮件,因为第一个实例尚未运行删除电子邮件的代码。

我认为这是一个并发问题。

我尝试了一些解决方案:

  1. synchronized 关键字添加到方法中。
  2. 添加一个名为isrun 的复选框。在任何实例运行该方法之前,它需要验证是否isrun == false。如果为false,则系统将运行该方法;如果为真,那么它将绕过所有代码。实例运行完方法后,会再次将isrun复选框更新为false。
  3. 增加窗口调度器的时间长度。每 15 分钟而不是 7 分钟运行一次此方法。
  4. 将方法从非静态更改为静态。

这些方法确实有帮助,但如果电子邮件太大,它们就无法使用。 (可能他们有很多附件。)

你知道如何解决这个问题吗?

【问题讨论】:

  • 感谢您重新编辑我的问题。

标签: java mysql concurrency jakarta-mail scheduler


【解决方案1】:

我假设 Windows 调度程序事件触发了 Java 应用程序的一个新实例。在这种情况下,您需要使用某种外部锁定。也许创建一个锁定文件。该过程检查是否存在锁定文件,如果不存在则创建一个,然后继续。第二个进程会检测到这个文件并且必须等待或中止。该过程完成后,它将删除锁定文件。您需要注意文件锁定是如何实现的,以便处理。您必须仔细实施锁定,以便多个进程不只是检查文件(同时),看到它不存在然后都尝试创建它。这应该不是问题,因为您的流程不会同时开始,但应该考虑。此处显示的示例:

How can I lock a file using java (if possible)

另一个解决方案是让 Java 应用程序持续运行,并且每 7 分钟运行一次更新。这样可以在内部执行同步。应用程序的主要部分将处于一个循环中并等待七分钟过去,然后运行您的更新例程(方法)。这将需要某种守护线程运行。 Apache 有这个,但要让它运行起来需要一些工作。

http://commons.apache.org/proper/commons-daemon/

调度程序中还有一个选项可以不并行运行。这可能是最简单的选择。查看底部任务属性的“设置”选项卡(Win 8)。如果有实例已在运行,您可以告诉它不要启动或等待。

【讨论】:

  • 锁文件如何处理这个问题?
  • 您写道“每七分钟运行一次更新。”您指的是哪个更新?
  • 您认为可以将文件(或电子邮件)锁定在外部电子邮件服务器中吗?如果你能在这里写一些代码示例,我会更喜欢。
  • 我不确定这是否可能。我的回答是试图指出您在问题中显示的方法将不起作用,因为它们在不同的过程中。
【解决方案2】:

你可以看看Quartz调度器。它是一个开源作业调度框架,可让您以极大的灵活性调度任务。

【讨论】:

  • 我的问题不是调度造成的。它是由两个触发器引起的,加载相同的电子邮件服务器。所以你的回答无济于事。
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2018-02-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多