如何在当地将GAE应用和GCE应用连接到同一个数据存储?

时间:2015-04-23 23:55:42

标签: google-app-engine google-compute-engine google-cloud-datastore

我遇到的问题与this类似。我有一个GAE应用程序和一个GCE应用程序似乎在云端工作正常,但我无法让我的本地环境工作,以便他们都访问相同的数据存储区。

我已经设置了本地数据存储区,如上面的链接中所述,除了我的代码看起来像这样(我必须以这种方式构建它以使其在云中工作):

print("Connecting to datastore - " + datasetId);

// Get credentials form GCE if not local.
Credential computeEngineCredential = DatastoreHelper.getComputeEngineCredential();

if(computeEngineCredential != null)
{
    print("Compute Engine Credetianls are not null! Access token: " + computeEngineCredential.getAccessToken());
}

DatastoreOptions options = DatastoreHelper.getOptionsfromEnv().credential(DatastoreHelper.getComputeEngineCredential()).dataset(datasetId).build();

print("Connection Host: " + options.getHost());
print("Connection Dataset: " + options.getDataset());

datastore = DatastoreFactory.get().create(options);

当我在本地运行GCE应用程序并尝试连接到正在运行的GAE数据存储区时,我得到以下内容(我已使用" myDatasetId"在下面的输出中替换了实际数据集ID):

  

连接到数据存储 - " myDatasetId"

     

连接主持人:http://localhost:8888

     

连接数据集:" myDatasetId"

     

com.google.api.services.datastore.client.DatastoreFactory makeClient

     

警告:不使用任何凭据

     

运行查询时出现问题:错误:   runQuery错误404

错误   404

      com.google.api.services.datastore.client.DatastoreException:错误404

错误   404

          在com.google.api.services.datastore.client.RemoteRpc.makeException(RemoteRpc.java:114)           在com.google.api.services.datastore.client.RemoteRpc.call(RemoteRpc.java:80)           在com.google.api.services.datastore.client.Datastore.runQuery(Datastore.java:109)

我的GAE控制台打印出来(我可以在8888端口访问管理控制台就好了):

  

com.google.appengine.tools.development.AbstractModule startup

     

信息:管理控制台正在http://localhost:8888/_ah/admin

运行      

com.google.appengine.tools.development.LocalResourceFileServlet doGet

     

警告:找不到以下文件:

     

/数据存储/ v1beta2 /数据集/" myDatasetId" / runQuery

我已经验证了GCE应用中的数据集ID和GAE应用匹配。我已经能够成功地自己运行每个应用程序,并且它们都能够正确连接到本地数据存储区(这是使用gcd应用程序的gcd.cmd工具)。基于上面链接中的答案,听起来这是可能的,我做错了吗?

更新

不确定这是否相关但我在启动GCD工具时遇到以下错误:

  

严重:无法加载App Engine开发代理。安全限制   不会完全模仿。了java.lang.RuntimeException:   演员阵容期间出现意外异常。           在com.google.apphosting.utils.clearcast.ClearCast $ CasterImpl.cast(ClearCast.java:385)           在com.google.apphosting.utils.clearcast.ClearCast.staticCast(ClearCast.java:252)           在com.google.apphosting.utils.clearcast.ClearCast.staticCast(ClearCast.java:263)           在com.google.appengine.tools.development.agent.AppEngineDevAgent.premain(AppEngineDevAgent.java:61)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)           at java.lang.reflect.Method.invoke(Unknown Source)           at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(未知   资源)           at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(未知   源)引起:java.lang.IllegalAccessException:Class   com.google.apphosting.utils.clearcast.ClearCast $ CasterImpl不能交流   cess是班级成员   com.google.appengine.tools.development.agent。$ Proxy0 with modifiers   "公共"           at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)           在java.lang.reflect.AccessibleObject.slowCheckMemberAccess(未知   资源)           at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)           at java.lang.reflect.Constructor.newInstance(Unknown Source)           在com.google.apphosting.utils.clearcast.ClearCast $ CasterImpl.cast(ClearCast.java:383)           ... 9更多

如果这个初始化正确,我可以以某种方式将我的GAE应用程序连接到GCD工具数据存储区吗?很困惑。

2 个答案:

答案 0 :(得分:2)

Java Development Serverdev_appserver.sh)和local Cloud Datastore toolgcd.sh)之间没有官方支持的方式来共享数据存储区数据。

但是,如果您的应用程序是用Java编写的,那么您可以使用here所述的解决方法,并通过指定{dev_appserver.shgcd.sh指向-Ddatastore.backing_store=<project dir>/WEB-INF/appengine-generated/local_db.bin生成的数据文件1}}选项。

答案 1 :(得分:0)

感谢您的回复,这非常有用。我能够通过提供“-Ddatastore.backing_store”作为你建议的VM参数,将我的本地GAE指向gcd工具通过eclipse使用的local_db.bin。

但是,他们似乎仍然拥有不同的数据存储视图。在默认8888端口上运行的GAE应用程序的管理员查看器仅显示GAE应用程序添加的数据,另一方面,在gcd工具端口(8080)上运行的gcd应用程序显示GCE应用程序添加的数据。

我认为这只是管理网站上的可见性问题所以我试图通过我的GCE应用程序访问GAE数据,但查询不成功,它似乎没有找到实体类型,因此没有返回任何结果。我能够验证一旦部署GCE能够访问GAE应用程序使用相同查询写入数据存储区的数据,由于这个原因,我假设它不是名称空间问题,而是更多关于数据保存位置的问题。即使它们都指向同一个local_db.bin文件,似乎数据仍在某处分开。

我是否应该直接从命令行运行dev_appserver.cmd?如果是这样,我如何为EAR项目(目前在eclipse上)执行此操作。