【问题标题】:Queue#addAsync with Transaction loses task sometimesQueue#addAsync with Transaction 有时会丢失任务
【发布时间】:2015-08-02 10:45:34
【问题描述】:

这是关于 Google App Engine/Java 的问题。

我正在尝试使用带有事务的异步 API 将任务添加到队列。

这是查看以下问题的最小示例。

https://gist.github.com/hogedigo/4e1943be5a3d3550a6ce

我循环了 10 次并将一个实体保存到数据存储区并将一个任务添加到队列中,但有时某些任务似乎丢失了。

我进行交易并将 tx 传递给 Queue#addTask。 所有实体总是被保存,但有些任务有时会丢失。 恐怕我做交易也没有一致性。

我不调用 addAsync 结果future 的get 方法。 我相信如果我得到未来的结果就可以了,但我不想这样做,因为我需要同时运行事务。

下面的文档说“调用 Transaction.commit() 会阻止所有异步调用的结果,因为事务在提交之前开始。”

https://cloud.google.com/appengine/docs/java/datastore/async#Working_with_Async_Transactions

Transaction.commit 仅阻止数据存储异步调用? 并且不阻塞任务队列异步调用?

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    addAsync() 返回一个Future<TaskHandle>。在你的位置上,我会尝试将未来添加到futures。这至少应该显示是否有隐藏的ExecutionException

    【讨论】:

    • 我刚刚尝试添加 futrues#add,但正如您所说,我看到了 ExecutionException。 ExecutionException 的原因是 IllegalArgumentException。我在生产日志上看不到异常消息,所以我在 devappserver 上运行。它说:``` java.lang.IllegalArgumentException: transaction has expired or is invalid ```我想知道我是否应该在commitAsync之后调用future#get ...
    • 有理由异步提交吗?如果您同步执行此操作,您将知道收集的期货失败是否重要。
    • 感谢您的建议,但我想并行运行其中的所有事务和 API 调用。数据存储异步调用似乎没问题。只有任务队列似乎有这个问题......
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多