web-dev-qa-db-ja.com

プログラムでローカルDynamoDBを起動する方法は?

次のコマンドを使用して、bashからlocal DynamoDBサーバーを起動できます。

Java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &

自分のコードでサーバーを起動する純粋なJavaの方法はありませんか? Java Processオブジェクトを介したシェルへのコールアウトではなく、アプリを実行するとサーバーが起動し、アプリが強制終了されるような方法です。 、サーバーが強制終了されます。

サーバーの整合性セマンティクスを反映するものが理想的ですが、そのようなモードが存在する場合は、組み込みデータベースを使用できます。

14

編集:2015年9月23日

2015年8月3日 に発表があり、同じプロセスで組み込みのDynamoDBローカルを実行する機能が追加されました。 Mavenテストの依存関係を追加し、以下のいずれかの方法を使用して実行できます。

<!--Dependency:-->
<dependencies>
    <dependency>
       <groupId>com.amazonaws</groupId>
       <artifactId>DynamoDBLocal</artifactId>
       <version>[1.11,2.0)</version>
    </dependency>
</dependencies>
<!--Custom repository:-->
<repositories>
    <repository>
       <id>dynamodb-local-oregon</id>
       <name>DynamoDB Local Release Repository</name>
       <url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
    </repository>
</repositories>

そして、これが awslabs/aws-dynamodb-examples Githubリポジトリからの例です。

AmazonDynamoDB dynamodb = null;
try {
    // Create an in-memory and in-process instance of DynamoDB Local that skips HTTP
    dynamodb = DynamoDBEmbedded.create().amazonDynamoDB();
    // use the DynamoDB API with DynamoDBEmbedded
    listTables(dynamodb.listTables(), "DynamoDB Embedded");
} finally {
    // Shutdown the thread pools in DynamoDB Local / Embedded
    if(dynamodb != null) {
        dynamodb.shutdown();
    }
}

// Create an in-memory and in-process instance of DynamoDB Local that runs over HTTP
final String[] localArgs = { "-inMemory" };
DynamoDBProxyServer server = null;
try {
    server = ServerRunner.createServerFromCommandLineArgs(localArgs);
    server.start();

    dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
        // we can use any region here
        new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
        .build();

    // use the DynamoDB API over HTTP
    listTables(dynamodb.listTables(), "DynamoDB Local over HTTP");
} finally {
    // Stop the DynamoDB Local endpoint
    if(server != null) {
        server.stop();
    }
}

古い答え

あなたが言ったように、現在、DynamoDBLocalまたはSDKからこれを行うための組み込みの方法はありません。同じプロセスで起動できる組み込みのDynamoDBLocalがあればいいのにと思います。

Java.lang.Process を使用して、他の人が興味を持った場合に備えてプログラムで起動およびシャットダウンする簡単な回避策/解決策を次に示します。

DynamoDBLocalのドキュメントは ここ にあり、引数の現在の定義は次のとおりです。

  • -inMemory —メモリ内で実行、ファイルダンプなし
  • -port 4000 —ポート4000を使用して通信します。
  • -sharedDb —資格情報と地域ごとに個別のファイルではなく、単一のデータベースファイルを使用します

これは2015年8月5日現在のDynamoDBLocalの最新バージョンを使用していることに注意してください

final ProcessBuilder processBuilder = new ProcessBuilder("Java",
        "-Djava.library.path=./DynamoDBLocal_lib",
        "-jar",
        "DynamoDBLocal.jar",
        "-sharedDb",
        "-inMemory",
        "-port",
        "4000")
        .inheritIO()
        .directory(new File("/path/to/dynamo/db/local"));

final Process process = processBuilder.start();

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        System.out.println("Shutdown DynamoDBLocal");
        process.destroy();
        try {
            process.waitFor(3, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            System.out.println("Process did not terminate after 3 seconds.");
        }
        System.out.println("DynamoDBLocal isAlive=" + process.isAlive());
    }
});
// Do some stuff
18
mkobit

Gradleタスクを記述してDynamodb-LocalZipを抽出すると、 https://github.com/marcoVermeulen/gradle-spawn-plugin gradleプラグインを使用してdynamodbローカルを起動できます。使い方はとても簡単で、プロセスビルダーの魔法をかける必要はありません。

サンプルコード-

// to start dynamodb-local
task launch(type: SpawnProcessTask) {
    println("Launching....")
    command "Java -Djava.library.path=/location/to/dynamodb-local/DynamoDBLocal_lib -jar /location/to/dynamodb-local/DynamoDBLocal.jar -inMemory -delayTransientStatuses"
    ready "Initializing DynamoDB Local"
}

// to stop dynamodb-local process
task stop(type: KillProcessTask)
0
Piyush Jajoo