Mic*_*sky 6 java google-app-engine objectify
为什么我想要异步加载Objectify实体?异步加载实际上意味着什么?
根据Objectify关于加载的文档,以下加载实体的方式是异步的:
// Simple key fetch, always asynchronous
Result<Thing> th = ofy().load().key(thingKey);
Run Code Online (Sandbox Code Playgroud)
如果我想要一个加载同步执行,那么我应该这样做:
Thing th = ofy().load().key(thingKey).now(); // added .now()
Run Code Online (Sandbox Code Playgroud)
对我而言,异步意味着该操作将在稍后的某个未指定时间发生.对于保存,异步是有意义的,因为数据存储区操作可能需要一些时间来完成而不会阻塞应用程序代码.
但是加载时,异步意味着负载会在另一个时间发生吗?如何在Java中实现这一点?我认为Result<Thing> th当代码行Result<Thing> th = ofy().load().key(thingKey);完成执行时必须更新变量.
作为一个新手,我花了很长时间才弄清楚这一点(例如参见Objectify错误"你不能在JUnit中为一个带有@Id的对象创建一个键").
所以我有几个问题:
1]为什么我想要异步加载Objectify实体?
2]异步加载实际意味着什么?
3] now()加载和now()保存之间的概念联系是什么?
同步负载(源)
Thing th = ofy().load().key(thingKey).now();
Run Code Online (Sandbox Code Playgroud)
同步保存(源)
ofy().save().entity(thing1).now();
Run Code Online (Sandbox Code Playgroud)
4]为什么不同步保存和加载的默认行为?
Google Cloud 支持对支持案例 05483551 的回复:
Java 上下文中的“异步”意味着使用“Future”或类似 Future 的构造。java[1] 中的 Future 是一个对象,它表示在当前线程中下一行开始执行时不一定需要执行和完成的操作。
在 Java 中对异步函数的调用将立即返回一个 Future,表示在下一行代码继续执行时,后台“线程”将在计算/网络调用上工作,而不需要该结果。当在 Future 对象上调用 .get() 方法时,要么返回结果,及时获得,要么线程等待直到获得结果,将执行传递到 .get() 调用后的下一行只有一次发生这种情况。
在 Objectify 中,避免了 Futures,而是定义了 Result 接口[2],原因是与抛出异常相关的原因使得在 Futures 的基础上开发变得痛苦。然而,它们以几乎相同的方式工作。常规 Future 具有 .get() 方法,而 Result 接口(由几个不同的具体类实现,具体取决于您正在执行的 Objectify 调用类型)具有 .now(),它检索结果或等待线程直到它可用.
您可能希望异步加载实体的原因是,当您有一个请求处理程序或 API 方法需要稍后在函数中使用实体时,但还有一些其他计算要做,与实体无关。您可以在第一行启动实体的负载,获取 Result,然后仅在其他无关代码完成执行后才对 Result 调用 .now() 。如果您等待调用 .now() 实际启动加载的时间点,您的响应处理程序/API 方法可能只是等待结果,而不是进行有用的计算。
最后,用于加载的 .now() 和用于保存的 .now() 之间的概念链接是这两个操作都发生在后台,并且只有在最终强制执行,等待执行线程,当 .now() 在 Result 上被调用时 -调用 save() 或 load() 返回的接口实现对象。
我希望这有助于为您解释 Java Objectify 中的异步构造。如果您有任何其他问题或问题,请随时在回复中包含这些内容,我将很乐意为您提供帮助。
真挚地,
Nick Technical Solutions 代表云平台支持
[1] http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html
[2] http://objectify-appengine.googlecode.com/svn/trunk/javadoc/com/googlecode/objectify/Result.html