java – 并发电子邮件处理(不发送垃圾邮件)

我有一个场景,我需要处理包含来自设备的一些模拟数据的csv文件.每行是表示某个时间点的设备状态的输出.在处理每一行时,检查特定列的方差/异常.

如果存在异常,则必须将电子邮件发送给具有检测到的异常的一群人.然而,为了避免垃圾邮件(csv有时可能是几十万行),我必须保持X秒的阈值.如果从同一条件(来自正在模拟的同一设备)发送相同异常的邮件< X秒回来,我必须忽略发送邮件. 目前我使用的解决方案对我来说似乎很笨拙 1)我保存邮件消息和设备ID以及异常检测时间. 2)为每个email-id创建一个“alert”,其中包含create-time-stamp,发送时间戳,message-id(来自步骤1)和device-id,状态为“NEW”. 3)在发送每封邮件之前,我会进行数据库读取,以查看状态为“SENT”的最后一封电子邮件的时间戳是否超出要忽略的阈值. (现在 – 发送时间戳>阈值)

如果是,那么我使用message-id获取所有警报并将其发送出去并将其所有状态更新为SENT-否则忽略.

我开始使用一个线程池执行器,并且一旦有多个线程试图发送电子邮件并更新发送时间戳,读取发送条件可能会失败.所以现在我已经将线程池大小设置为1 – 这超过了执行程序的目的. (我没有行级锁定,因为我使用Mongo作为支持db).后备数据存储区必须是一个nosql存储区,因为字段可能会发生很大变化,并且不适合计算机的磁盘,因为更多的模拟设备会被管道输入.

应用程序是分布式的 – 因此任何随机节点都可以选择csv文件来处理和通知.

阿卡会成为这种过程的好候选人吗?任何有关实施此操作的经验的见解或经验教训都是受欢迎的(我必须坚持使用JVM).

最佳答案 您可以使用分布式Akka作为替换(请参阅此处的良好教程
http://www.addthis.com/blog/2013/04/16/building-a-distributed-system-with-akka-remote-actors/#.U-HWzvmSzy4)但为什么?只是更新已经有效的内容:

1)完全删除Executor,这里不需要,逐个发送电子邮件(我想你不是想一次发送数百万封邮件,对吧?)

2)应用程序上的旧消息的清理数据库开始解决磁盘空间问题.

点赞