为什么我要异步加载Objectify实体?异步加载实际上是什么意思?
根据有关加载的Objectify文档,以下加载实体的方法是异步的:
// Simple key fetch, always asynchronous
Result<Thing> th = ofy().load().key(thingKey);
如果我想让负载同步执行,那么我应该这样做:
Thing th = ofy().load().key(thingKey).now(); // added .now()
对我而言,异步意味着该操作将在以后的某个未指定时间进行。为了节省,异步是有意义的,因为数据存储操作可能需要一些时间才能自行完成而不阻塞应用程序代码。
但是对于加载,异步是否意味着加载将在其他时间发生?在Java中怎么可能?我以为Result<Thing> th
代码行Result<Thing> th = ofy().load().key(thingKey);
完成执行时必须更新变量。
作为一个新手,我花了很长时间才弄清楚这一点(例如,在JUnit中查看Objectify错误“您无法为具有空@Id的对象创建键”)。
所以我有几个问题:
1]为什么我要异步加载Objectify实体?
2]异步加载实际上是什么意思?
3]now()
加载和now()
保存之间的概念链接是什么?
同步负载(源)
Thing th = ofy().load().key(thingKey).now();
同步保存(源)
ofy().save().entity(thing1).now();
4]为什么不同步保存和加载的默认行为?
Google云端支持对支持案例05483551的回复:
在Java上下文中,“异步”表示使用“未来”或类似Future的构造。java [1]中的Future是一个对象,该对象表示在当前线程中的下一行开始执行时,不一定需要执行和完成的操作。
在Java中对异步函数的调用将立即返回Future,这表示在代码的下一行继续执行的同时,后台“线程”将在计算/网络调用上起作用,但仍不需要该结果。在Future对象上调用方法.get()时,要么及时返回结果,要么返回结果,否则线程将等待直到获得结果,然后将执行传递给.get()调用之后的下一行只有这种情况发生一次。
在Objectify中,避免使用Futures,而是定义了Result接口[2],原因是与引发异常有关的原因使基于Futures进行开发很痛苦。但是,它们的工作方式几乎相同。如果常规的Future方法具有.get()方法,则Result接口(由几个不同的具体类实现,具体取决于您执行的是哪种Objectify调用)具有.now(),该方法检索结果或等待线程直到可用。
之所以可能要异步加载实体,是因为您有一个请求处理程序或API方法,该请求处理程序或API方法稍后需要在函数中使用一个Entity,但是还需要执行一些与Entity不相关的其他计算。您可以在第一行中为实体启动负载,获取Result,然后在其他不相关的代码完成执行后,仅对Result调用.now()。如果在调用.now()实际启动加载时等待了一点,则可能让响应处理程序/ API方法只是在等待结果,而不是进行有用的计算。
最后,要加载的.now()和要保存的.now()之间的概念性联系是,这两个操作都在后台发生,并且只有在对Result-调用.now()时才最终强制执行,等待执行线程由save()或load()的调用返回的接口实现对象。
我希望这有助于为您解释Java Objectify中的异步构造。如果您还有其他疑问或问题,请随时将其包含在您的回复中,我们将竭诚为您服务。
真挚地,
尼克技术解决方案代表云平台支持
[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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句