我遇到的问题与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工具数据存储区吗?很困惑。
答案 0 :(得分:2)
在Java Development Server(dev_appserver.sh
)和local Cloud Datastore tool(gcd.sh
)之间没有官方支持的方式来共享数据存储区数据。
但是,如果您的应用程序是用Java编写的,那么您可以使用here所述的解决方法,并通过指定{dev_appserver.sh
将gcd.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上)执行此操作。