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状态就足以说服邮件传递系统已经处理了邮件。
我错过了什么?
答案 0 :(得分:1)
可能相关或不相关,计划任务有时也会出现接收额外或重复的servlet请求。
在生产环境中,AppEngine偶尔会以任何非显而易见的原因启动其他服务器实例。这些新启动的服务器似乎与已经运行的实例发送了相同的请求。我认为该症状与应用程序无法控制的GAE云服务器冗余和高可用性活动有关。
这确实意味着必须编写应用程序逻辑以以幂等方式执行工作。例如,在第一次接收传入数据时,添加新记录,并在第二次和稍后收到相同数据时,丢弃数据(或更新最初添加的记录)。这样的代码需要事务隔离,这会增加延迟,从而调用任务队列。
因此,我建议在实现processMessage
时添加重复数据删除逻辑。
答案 1 :(得分:1)
找到它。
问题是我正在捕获软DeadlineExceeded异常,然后在我的进程被HardDeadlineExceededError杀死之前做了太多处理