2016-10-31 2 views
2

Я использую клиентскую библиотеку хранилища данных Google Cloud для Java, чтобы получить доступ к облачному хранилищу данных.Google Datastore Emulator с использованием Java (не используя GAE)

Примечание: Я не использую App Engine для развертывания приложения; просто запуская локальное приложение для целей разработки.

Следуя примеру, я могу читать/писать в облачный хранилище данных.

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

Я хочу, чтобы иметь возможность писать вместо локального экземпляра эмулятора хранилища данных. Следующее руководство 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 вызов к сообщению или восстановить юридическое лицо, но это только чтение/запись против Cloud Datastore. Заголовок 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); }

Я начал свой Датастор Emulator на локальном хосте: 9999. Установите это как хост при создании DatastoreOptions.

Я подтвердил, что консоль эмулятора показывает, что запросы получены, и объекты сохраняются. Я также проверил файл данных (local_db.bin), и он показывает данные (конечно, это не обычный текстовый файл).

Единственное, что я не знаю, - это способ управления локальным хранилищем данных с помощью интерфейса браузера. Я не мог найти много документации о том, как администрировать локальное хранилище данных, точно так же, как мы делаем удаленный из Cloud Console. Возможно, кто-то может помочь в этом.

+0

Есть ли способ просмотра данных из .bin-файла? – Kookz

+0

Вы должны уметь видеть текстовые фрагменты (в моем примере, Hello World!) Ваших данных, если вы откроете файл в текстовом редакторе, но вы увидите другие байты, которые не переводятся в текст. –

+0

Чтобы уточнить, я запускаю эмулятор, используя «gcloud beta emulators datastore start», обратите внимание на любой порт, который он использует, и укажите этот порт, когда я создаю экземпляр Datastore? – Kookz

2

Я предполагаю, что вы хотите протестировать против эмулятора хранилища данных. В этом случае нет необходимости запускать эмулятор Datastore из оболочки. В библиотеке gcloud есть LocalDatastoreHelper, который позволяет вам легко создавать, запускать, перезагружать и останавливать локальный эмулятор хранилища данных.

я не нашел никаких документов по этому поводу, так что я создал этот testcases для вас:

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 создает экземпляр Datastore эмулятора на свободный порт и не хранит на диске - когда вам остановить TestCase с отладчик и посмотреть на процессы, вы найдете что-то вроде этого:

$ 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

Смежные вопросы