0

我正在开发一个充当移动电子邮件客户端的 Web 应用程序。在此应用程序中,用户可以登录并提供大量电子邮件 ID 进行监控。Web 应用程序中有两个主要类。1.MailGetter 2.MailFormatter

MailGetter 类的行为:

  1. Timertask 已启动,每 10 分钟执行一次
  2. 从数据库中获取大量用于监控的电子邮件 ID
  3. 为第一个电子邮件 ID 建立与邮件服务器的连接并获取最近到达的电子邮件消息对象
  4. 将消息对象传递给 MailFormatter 类

MailFormatter 类的行为:

  1. 解析电子邮件消息对象
  2. 如果消息有许多多部分,则进行各种递归调用,以便一一解析
  3. 连同此消息一起下载附件
  4. 向 MailGetter 类返回一个 xml 字符串,该类将存储为具有以下内容的简单文本文件:

例子:

<mail>
<from>FromEmailID</from>
<to>ToEmailID</to>
<subject>Subject</subject>
<body>Email Body</body>
<attachments>
  attachment
</attachments>
</mail>

MobileResponderServlet:Web 应用程序中还编写了一个单独的 servlet,它将读取简单的 xml 文本文件并将读取的内容发送到移动设备

此应用程序的主要缺点可能是“MailGetter”类将等待“MailFormatter”类的所有函数(包括递归调用)执行完毕。一旦控件从“MailFormatter”类返回到“MailGetter”类,它将从邮件服务器获取下一个消息对象并将其传递给“MailFormatter”类。因此向移动用户提示新电子邮件会消耗时间。即使“MailFormatter”类被实现为一个单独的线程,考虑在单个收件箱中是否有 1000 封新电子邮件(对于单个 emailid),这将调用 1000 个“MailFormatter”线程,这将使进程获得更多资源密集的。

所以我决定从“MailGetter”中拔出“MailFormatter”。“MailGetter”将作为单独的 Web 应用程序在一个服务器中运行,而“MailFormatter”将作为单独的 Web 应用程序在另一台服务器中运行。在获得最近的电子邮件消息对象“MailGetter”后,Web 应用程序(通过 message.writeTo(FileOutputstream))将消息对象保留在“MailFormatter”也常见的位置。然后“MailFormatter”类读取(通过 MimeMessage(Session,InputStream) 构造函数)并逐个解析消息对象,然后将“XML 内容”存储在另一个位置,该位置将由“MobileResponderServlet”读取并发送到移动设备。

这个过程会实时有效吗?这是否会出现问题,尤其是在“MailGetter”和“MailFormatter”Web 应用程序之间共享消息对象时?如果还有其他方法,请告诉我。此 Web 应用程序将处理 5000 多个用户(最少),这些用户提供了大量的电子邮件 ID 进行监控。

4

1 回答 1

0

我认为你能做的唯一实际的事情就是把一些测试场景放在一起。上面的变量太多,无法保证与性能相关的实际答案。

将包含一组测试电子邮件的源邮箱放在一起,然后拼凑一些简单的机制来查询它,将您的邮件转储出去,然后使用您的第二个进程来消费。这种机制很可能不是您的完整解决方案,但应该具有代表性。

使其可重复和一致是一个好主意,因此当您实施真正的解决方案时,您可以研究它是否变得越来越慢,和/或基准测试和测量是否一致。

于 2009-06-30T11:15:37.140 回答