2016-10-31 14 views
2

Google CloudのDatastore Client Library for Javaを使用してCloud Datastoreにアクセスしています。Javaを使用したGoogle Datastoreエミュレータ(GAEを使用しない)

:私はアプリケーションを配備するためにApp Engineを使用していません。開発目的でローカルアプリケーションを実行するだけです。

この例では、Cloud Datastoreを読み書きできます。

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

ローカルのDatastoreエミュレータインスタンスに書き込むことができます。 ガイドhereに続いて、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: [[email protected]] 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呼び出しを行いますが、このクラウドデータストアに対する読み取り/書き込みのみです。 localhost:8964/datastoreに私にNot Foundを与える。エミュレータを起動すると、local_db.binというファイルが作成されたように見えますが、それを含むフォルダは空です。 また、ローカルエミュレータにアクセスするためにLocalDatastoreHelperを使用しないようにしたいと思います。 gcloudのみを使用して達成する方法はありますか?

答えて

2

以下の行は、常にリモートデータストアに接続します。 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); }

私はローカルホスト上で自分のデータストアエミュレータを開始しました:9999。 DatastoreOptionsを構築するときにホストとして設定します。

私は、エミュレータコンソールが要求を受け取り、エンティティが保持されていることを確認しました。私もデータファイル(local_db.bin)をチェックして、データを表示します(もちろん、プレーンテキストファイルではありません)。

ブラウザインタフェースを使用してローカルデータストアを管理する方法があるかどうかわかりません。クラウドコンソールからリモートデータストアを操作するのと同じように、ローカルデータストアを管理する方法に関する多くのドキュメントを見つけることができませんでした。他の誰かがこれを助けるかもしれません。

+0

.binファイルからデータを表示する方法はありますか? – Kookz

+0

テキストエディタでファイルを開くと、データのテキストフラグメント(私の例ではHello World!)を見ることができるはずですが、テキストに変換されない他のバイトが表示されます。 –

+0

明確にするために、私は 'gcloud beta emulators datastore start'を使用してエミュレータを起動し、使用するポートをメモし、Datastoreインスタンスを構築するときにそのポートを指定します。 – Kookz

2

データストアエミュレータに対してテストするとします。その場合、データストアエミュレータをシェルから起動する必要はありません。 gcloudライブラリにLocalDatastoreHelperがあり、簡単にローカルDatastoreエミュレータを作成、開始、リセット、停止することができます。

私はその上の任意のドキュメントが見つかりませんでしたので、私は、これはあなたのためのテストケースを作成しました:

import com.google.cloud.datastore.Datastore; 
import com.google.cloud.datastore.DatastoreOptions; 
import com.google.cloud.datastore.Entity; 
import com.google.cloud.datastore.KeyFactory; 
import com.google.cloud.datastore.testing.LocalDatastoreHelper; 
import org.junit.*; 

import java.io.IOException; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertNull; 

/** 
* This testcase demonstrate the use of the datastore emulator in JUnit test cases. 
* 
* from @link https://www.kontaktlinsen-preisvergleich.de 
*/ 
public class DatastoreEmulatorTest { 

    protected static LocalDatastoreHelper localDatastoreHelper; 

    protected Datastore datastore; 

    protected KeyFactory keyFactory; 

    @BeforeClass 
    public static void setUpClass() throws InterruptedException, IOException { 
     // create and start a local datastore emulator on a random free port 
     // this also means that you probably can run tests like this concurrently. 
     System.out.println("[Datastore-Emulator] start"); 
     localDatastoreHelper = LocalDatastoreHelper.create(); 
     localDatastoreHelper.start(); 
     System.out.println("[Datastore-Emulator] listening on port: " + localDatastoreHelper.getPort()); 

     // set the system property to tell the gcloud lib to use the datastore emulator 
     System.setProperty("DATASTORE_EMULATOR_HOST","localhost:" + localDatastoreHelper.getPort()); 
    } 

    @Before 
    public void setUp() { 
     // create the datastore instance 
     // because of the system property set it in setUpClass() this 
     // datastore will be connected with the datastore emulator. 
     datastore = DatastoreOptions.getDefaultInstance().getService(); 
     keyFactory = datastore.newKeyFactory().setKind("TestEntity"); 
    } 

    @After 
    public void tearDown() throws IOException { 
     System.out.println("[Datastore-Emulator] reset"); 
     // this resets the datastore after every test 
     localDatastoreHelper.reset(); 
    } 

    @AfterClass 
    public static void tearDownClass() throws InterruptedException, IOException { 
     System.out.println("[Datastore-Emulator] stop"); 
     // this stops the datastore emulator after all tests are done 
     localDatastoreHelper.stop(); 
    } 

    @Test 
    public void test1() { 
     // stores an entity in the datastore and retrieves it later 

     // create an Entity "TestEntity" 
     Entity.Builder builder = Entity.newBuilder(keyFactory.newKey(42)); 
     builder.set("name", "Test1"); 

     // store it in datastore 
     datastore.put(builder.build()); 

     // retrieve entity by key 
     Entity entity = datastore.get(keyFactory.newKey(42)); 
     assertNotNull(entity); 
     assertEquals("Test1", entity.getString("name")); 
    } 

    @Test 
    public void test2() { 
     // try to access the entity created in test1, shouldn't work because 
     // of calling reset in tearDown() after each test. 

     // try to retrieve entity by key 
     Entity entity = datastore.get(keyFactory.newKey(42)); 
     assertNull(entity); 
    } 
} 

LocalDatastoreHelperが空いているポート上でデータストアエミュレータインスタンスを作成し、ディスクに保存しない - ときまた、あなたがあまりにも、並行してテストを実行することができるはずです意味

$ ps ax | grep CloudDatastore 
2614 ?? R  0:01.39 /usr/bin/java -cp /Users/marco/google-cloud-sdk/platform/cloud-datastore-emulator/CloudDatastore.jar com.google.cloud.datastore.emulator.CloudDatastore /Users/marco/google-cloud-sdk/platform/cloud-datastore-emulator/cloud_datastore_emulator start --host=localhost --port=57640 --store_on_disk=False --consistency=0.9 --allow_remote_shutdown /var/folders/ky/c126qk_161159ltyrbpdxv8w0000gn/T/gcd2141205756617995044 

:デバッガとテストケースを停止し、プロセスを探して、あなたはこのような何かを見つけることができます。

+0

これは内部APIなので、使用しないでください。ソースコードをご覧ください:https://github.com/GoogleCloudPlatform/google-cloud-java/blob/master/google-cloud-datastore/src/main/java/com/google/cloud/datastore/testing/LocalDatastoreHelper.java #L49 – Pijusn

関連する問題