如何通过编程方式启动本地DynamoDB?

16
我能够通过以下命令从终端启动一个本地DynamoDB服务器:local
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &

是否有一种纯 Java 的方式在代码中启动服务器?我不是指通过Process对象调用 shell,而是一种当我运行我的应用程序时,服务器启动,当我的应用程序被杀死时,服务器被关闭的方式。

如果存在这样的模式,我可以使用嵌入式数据库,尽管最好是反映服务器一致性语义的东西。


2
我有完全相同的用例。对我来说,“进程”选项也有效,但是我如何以编程方式在类路径中找到jar包?我的意思是,这个jar和它的依赖关系都在一个zip文件中,这个文件被缓存在~/.gradle/caches中。 - Piyush Jajoo
@PiyushJajoo 看看我的更新答案。看起来我错过了他们宣布内存方式的公告! - mkobit
如果您使用嵌入式,请阅读:https://dev59.com/GVsX5IYBdhLWcg3wLc-J#35353377 - Jayson Minard
2个回答

21

编辑: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

1
我无法从指定的仓库(http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release)获取此构件,也没有其他可用的仓库。我将发布一个单独的问题,但您有任何想法为什么我一直在下载时出错吗?这个仓库还在运行吗? - Sridhar Sarnobat
这个答案可能存在问题,请阅读:https://dev59.com/GVsX5IYBdhLWcg3wLc-J#35353377 - Jayson Minard
Maven 中当前的版本是 1.10.20 - Jayson Minard
@SridharSarnobat,Mulesoft似乎在他们的版本库中托管了DynamoDbLocal:https://mvnrepository.com/artifact/com.amazonaws/DynamoDBLocal - Alastair McCormack

0

编写一个Gradle任务来提取Dynamodb-Local zip文件,现在您可以使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接