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

3
我遇到了类似于这个问题。我有一个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数据存储时,我会得到以下输出(我已将实际数据集ID替换为“myDatasetId”):
连接到数据存储 - “myDatasetId” 连接主机:http://localhost:8888 连接数据集:“myDatasetId” com.google.api.services.datastore.client.DatastoreFactory makeClient 警告:未使用任何凭据 运行查询时出现问题:错误: runQuery 错误404 Error 404 com.google.api.services.datastore.client.DatastoreException:错误404 Error 404 at com.google.api.services.datastore.client.RemoteRpc.makeException(RemoteRpc.java:114) at com.google.api.services.datastore.client.RemoteRpc.call(RemoteRpc.java:80) at com.google.api.services.datastore.client.Datastore.runQuery(Datastore.java:109)
我的GAE控制台会打印出这个(我可以正常访问8888端口中的管理控制台):
com.google.appengine.tools.development.AbstractModule startup INFO:管理员控制台正在http://localhost:8888/_ah/admin运行 com.google.appengine.tools.development.LocalResourceFileServlet doGet 警告:未找到文件:
/datastore/v1beta2/datasets/"myDatasetId"/runQuery
我已验证了GCE应用程序和GAE应用程序中的数据集ID匹配。我已成功地在各自的本地运行每个应用程序,并且它们都能够正确地连接到本地数据存储(这是在使用gcd.cmd工具为GCE应用程序时)。根据上面链接中的答案,似乎这是可能的,我做错了什么吗?
更新
不确定是否相关,但在启动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)处 在sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)处 在sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)处 在sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)处 在java.lang.reflect.Method.invoke(Unknown Source)处 在sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)处 在sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)处
原因是:java.lang.IllegalAccessException:类com.google.apphosting.utils.clearcast.ClearCast $ CasterImpl无法访问具有修饰符“public”的类com.google.appengine.tools.development.agent.$Proxy0的成员。
如果它已经初始化,我是否可以以某种方式将我的GAE应用连接到GCD工具数据存储库?感到困惑。
2个回答

2

没有官方支持的方法可以在Java开发服务器(dev_appserver.sh)和本地Cloud Datastore工具(gcd.sh)之间共享Datastore数据。

然而,如果您的应用程序是用Java编写的,您可能可以使用这里描述的解决方法,并通过指定-Ddatastore.backing_store=<project dir>/WEB-INF/appengine-generated/local_db.bin选项将dev_appserver.sh指向由gcd.sh生成的数据文件。


谢谢Ed,可以看一下我下面的回答。 - Laura

0

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

然而,它们似乎仍对数据存储有不同的看法。在默认的8888端口运行的GAE应用程序的管理员查看器只显示由GAE应用程序添加的数据,另一方面,在gcd工具端口(8080)上运行的gcd查看器则显示由GCE应用程序添加的数据。

我认为这只是管理站点上的可见性问题,因此我尝试通过我的GCE应用程序访问GAE数据,但是查询失败,它似乎找不到实体类型,因此返回零结果。我能够验证,一旦部署了GCE,它就能够使用相同的查询访问GAE应用程序写入数据存储库的数据,因此我假设这不是命名空间问题,而更多是数据存储位置的问题。即使它们都指向相同的local_db.bin文件,似乎数据仍然分裂。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接