当前位置: 首页 > 面试题库 >

使用Java的Google数据存储模拟器(不使用GAE)

姬和歌
2023-03-14
问题内容

我正在使用Google Cloud的Java数据存储客户端库访问Java数据存储。

注意 :我没有使用App Engine来部署我的应用程序;仅出于开发目的运行本地应用程序。

按照示例,我可以读取/写入Cloud Datastore。

Datastore datastore = DatastoreOptions.defaultInstance().service();
KeyFactory keyFactory = datastore.newKeyFactory().setKind("MyKind");
Key key = keyFactory.newKey();
Entity entity = datastore.get(key);

我希望能够改为写入本地数据存储模拟器实例。按照这里的指南,我跑步gcloud beta emulators datastore start。这显示在我的终端中:

C:\Users\User>gcloud beta emulators datastore start
WARNING: Reusing existing data in [C:\Users\User\AppData\Roaming\gcloud\emulators\datastore].
Executing: cmd /c C:\Users\User\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\cloud-datastore-emulator\cloud_datastore_emulator.cmd start --host=localhost --port=8964 --store_on_disk=True --consistency=0.9 --allow_remote_shutdown C:\Users\User\AppData\Roaming\gcloud\emulators\datastore
[datastore] Oct 31, 2016 11:37:27 AM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$7 apply
[datastore] INFO: Provided --allow_remote_shutdown to start command which is no longer necessary.
[datastore] Oct 31, 2016 11:37:27 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub <init>
[datastore] INFO: Local Datastore initialized:
[datastore]     Type: High Replication
[datastore]     Storage: C:\Users\User\AppData\Roaming\gcloud\emulators\datastore\WEB-INF\appengine-generated\local_db.bin
[datastore] Oct 31, 2016 11:37:28 AM io.grpc.internal.ManagedChannelImpl <init>
[datastore] INFO: [ManagedChannelImpl@5e955596] Created with target localhost:8964
[datastore] Oct 31, 2016 11:37:28 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load
[datastore] INFO: The backing store, C:\Users\User\AppData\Roaming\gcloud\emulators\datastore\WEB-INF\appengine-generated\local_db.bin, does not exist. It will be created.
[datastore] Oct 31, 2016 11:37:28 AM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround
[datastore] INFO: Unable to apply Java 7 long hostname workaround.
[datastore] API endpoint: http://localhost:8964
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore]
[datastore]   export DATASTORE_EMULATOR_HOST=localhost:8964
[datastore]
[datastore] Dev App Server is now running.
[datastore]

我打开另一个终端并设置环境变量

C:\Users\User>gcloud beta emulators datastore env-init > set_vars.cmd && set_vars.cmd
C:\Users\User>set DATASTORE_DATASET=my-project-id
C:\Users\User>set DATASTORE_EMULATOR_HOST=localhost:8964
C:\Users\User>set DATASTORE_EMULATOR_HOST_PATH=localhost:8964/datastore
C:\Users\User>set DATASTORE_HOST=http://localhost:8964
C:\Users\User>set DATASTORE_PROJECT_ID=my-project-id

我运行应用程序并进行REST调用以发布或检索实体,但这仅针对Cloud
Datastore进行读取/写入。前往localhost:8964/datastore给我Not Found。尽管启动模拟器会告诉我它创建了local_db.bin文件,但是据推测包含该文件的文件夹为空。我也想避免使用LocalDatastoreHelper来访问本地仿真器。有什么方法可以只使用gcloud吗?


问题答案:

下面的线始终连接到遥控器datastore。使用设置中的默认选项(例如项目,身份验证凭据)gcloud

Datastore datastore = DatastoreOptions.defaultInstance().service();

要连接到本地数据存储,请尝试以下操作:

@Test
public void test1() throws IOException, InterruptedException {
    Datastore ds = DatastoreOptions.builder().host("http://localhost:9999").projectId("my-project").build().service();
    com.google.cloud.datastore.Key key = ds.newKeyFactory().kind("MyEntity").newKey("mykey");
    com.google.cloud.datastore.Entity entity = com.google.cloud.datastore.Entity.builder(key).set("p1", "Hello World!").build();
    entity = ds.put(entity);
    entity = ds.get(key);
    System.out.println(entity);
}

我在上启动了数据存储模拟器localhost:9999。构建DatastoreOptions时将其设置为主机。

我已确认仿真器控制台显示已收到请求,并且实体已保留。我还检查了数据文件(local_db.bin),它显示了数据(当然,它不是纯文本文件)。

我不知道的一件事-是否有一种使用浏览器界面管理本地数据存储的方法。我找不到太多有关如何管理本地数据存储的文档,就像我们从Cloud
Console中进行远程操作一样。也许其他人可以帮助您。



 类似资料:
  • 我已经设置了,其根url指向本地PubSub模拟器(在我的例子中)。它似乎工作,我看到模拟器正在接收我的测试推送,但给我错误400错误的请求。 如何将库与本地模拟器一起使用?

  • 我试图在Laravel 5.8中实现Azure存储模拟器 它在Azure dev上工作 与公共和私有文件夹一样,我们试图将其实现为存储磁盘。我们认为只需使用相同类型的条目-而是使用. env文件中的共享密钥凭据就可以工作: 存储资源管理器已安装,可以查看Blob、队列和表。并且模拟器的状态报告: 我不知道什么样的授权头可以让它工作。 我们正在使用matthewbdaly/laravel azure

  • 问题内容: 我已经成功授权了我的桌面应用程序。它存储一个名为的文件。为了不必在每次运行应用程序时都将URL复制到浏览器,接受等步骤,我想使用已经存储的凭据。 到目前为止,我的代码: 如何读取存储的凭证并绕过命令行提示符? 我在想类似的东西: 问题答案: 您可以像这样从存储的凭据创建GoogleCredential对象:

  • 我正在使用Spring的RedisTemplate与Redis接口。 目前,我在Redis中存储的数据使用OpsForHash操作,因为这最适合我存储的数据。 这可能使用一个单独的redistemplate吗? 谢了!

  • 我对哈克斯姆有意见。在我使用Windows7之前,一切都很好,但升级到Win8.1 Pro后,当我从AVD屏幕上启动模拟器时,我看不到haxm启动消息。HAXM已经安装并运行良好,我安装了x86的映像,我的设备使用它,但仍然不能在启动窗口中看到模拟器正在使用HAXM的确认消息。 null

  • 问题内容: 要放置在数据存储区中的对象将具有一组标签。 在Python中,Google App Engine具有列表属性的概念。Java(如果存在)中的等效概念是什么?如何在Java,JPA和/或JDO中使用列表属性? 问题答案: 确切地看到我的博客文章:具有关系索引实体的有效关键字搜索和Google数据存储区的Objectify。它讨论了使用关系索引实体和Objectify通过列表属性实现搜索。