为什么我的Appengine收到的电子邮件重复了?

时间:2014-02-20 05:01:59

标签: google-app-engine email

AppEngine我遇到了一个奇怪的问题。我已经配置了一个servlet来接收和处理电子邮件。我的帖子方法是......

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        try {
            processMessage(req);
        } catch (Exception e) {
            e.printStackTrace();
        }
        resp.setStatus(200); // whatever happens, don't encourage a retry
    }

processMessage通常有效,但偶尔会因截止日期超过而失败。 (在某些时候,我会重构我的架构以使用任务队列,但在我这样做之前,我想理解并解决以下问题。)

我所看到的是我的servlet不断收到测试电子邮件的重复内容。好像邮件传递机制正在感知传递失败,并正在重试它。

我原本以为抓住任何例外并强制获得200状态就足以说服邮件传递系统已经处理了邮件。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

可能相关或不相关,计划任务有时也会出现接收额外或重复的servlet请求。

在生产环境中,AppEngine偶尔会以任何非显而易见的原因启动其他服务器实例。这些新启动的服务器似乎与已经运行的实例发送了相同的请求。我认为该症状与应用程序无法控制的GAE云服务器冗余和高可用性活动有关。

这确实意味着必须编写应用程序逻辑以以幂等方式执行工作。例如,在第一次接收传入数据时,添加新记录,并在第二次和稍后收到相同数据时,丢弃数据(或更新最初添加的记录)。这样的代码需要事务隔离,这会增加延迟,从而调用任务队列。

因此,我建议在实现processMessage时添加重复数据删除逻辑。

答案 1 :(得分:1)

找到它。

问题是我正在捕获软DeadlineExceeded异常,然后在我的进程被HardDeadlineExceededError杀死之前做了太多处理

相关问题