Amazon dynamodb 如何以编程方式启动本地DynamoDB?

Amazon dynamodb 如何以编程方式启动本地DynamoDB?,amazon-dynamodb,Amazon Dynamodb,我可以通过以下命令从bash启动本地DynamoDB服务器: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb & 难道没有一种纯java的方式在代码中启动服务器吗?我指的不是通过进程对象对shell的java调用,而是当我运行我的应用程序时,服务器启动,当我的应用程序被终止时,服务器被终止 如果存在这样一种模式,我可以使用嵌入式数据库,不过最好使用反映服务器一致性语义的方式 编辑

我可以通过以下命令从bash启动本地DynamoDB服务器:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &
难道没有一种纯java的方式在代码中启动服务器吗?我指的不是通过
进程
对象对shell的java调用,而是当我运行我的应用程序时,服务器启动,当我的应用程序被终止时,服务器被终止


如果存在这样一种模式,我可以使用嵌入式数据库,不过最好使用反映服务器一致性语义的方式

编辑:2015年9月23日

上有一个公告,现在添加了在同一进程中运行嵌入式DynamoDB本地的功能。您可以添加Maven测试依赖项,并使用以下方法之一运行它


亚马逊网站
Github存储库:

AmazonDynamoDB dynamodb=null;
试一试{
//创建跳过HTTP的DynamoDB Local的内存内和进程内实例
dynamodb=DynamoDBEmbedded.create().amazonDynamoDB();
//将dynamodbapi与DynamoDBEmbedded一起使用
listTables(dynamodb.listTables(),“dynamodb嵌入式”);
}最后{
//关闭DynamoDB本地/嵌入式中的线程池
if(dynamodb!=null){
发电机B.关闭();
}
}
//创建通过HTTP运行的DynamoDB Local的内存内和进程内实例
最后一个字符串[]localArgs={“-inMemory”};
DynamoDBProxyServer服务器=null;
试一试{
server=ServerRunner.createServerFromCommandLineArgs(localArgs);
server.start();
dynamodb=AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
//我们可以使用这里的任何区域
新的AwsClientBuilder.EndpointConfiguration(“http://localhost:8000“,”美国西部-2“))
.build();
//通过HTTP使用DynamoDB API
listTables(dynamodb.listTables(),“dynamodb本地HTTP”);
}最后{
//停止DynamoDB本地端点
如果(服务器!=null){
server.stop();
}
}

旧答案

正如您所说,目前还没有来自DynamoDBLocal或SDK的内置方法来完成这项工作。如果有一个嵌入式DynamoDBLocal,您可以在相同的过程中启动它,那就太好了

这里有一个简单的解决方法/解决方案,用于在其他人感兴趣的情况下以编程方式启动和关闭它

可以找到DynamoDBLocal的文档,以下是参数的当前定义:

  • -inMemory
    -在内存中运行,无文件转储
  • -端口4000
    -使用端口4000进行通信
  • -sharedDb
    -对每个凭证和区域使用单个数据库文件,而不是单独的文件
请注意,这使用的是2015年8月5日最新版本的DynamoDBLocal

final ProcessBuilder ProcessBuilder=新的ProcessBuilder(“java”,
“-Djava.library.path=./DynamoDBLocal_lib”,
“-jar”,
“DynamoDBLocal.jar”,
“-sharedDb”,
“-inMemory”,
“-端口”,
"4000")
.inheritIO()
.directory(新文件(“/path/to/dynamo/db/local”);
最终流程=processBuilder.start();
Runtime.getRuntime().addShutdownHook(新线程(){
@凌驾
公开募捐{
System.out.println(“关机动态校准”);
process.destroy();
试一试{
进程。等待(3,时间单位。秒);
}捕捉(中断异常e){
System.out.println(“进程在3秒后未终止”);
}
System.out.println(“DynamoDBLocal isAlive=“+process.isAlive());
}
});
//做点什么

编写一个gradle任务来提取Dynamodb本地zip,现在您可以使用gradle插件启动Dynamodb本地。它非常易于使用,无需执行任何process builder魔术

示例代码-

// 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)

我有完全相同的用例。“Process”选项也适用于我,但是如何在类路径中以编程方式找到jar呢。我的意思是,jar及其依赖项在一个zip中,它被缓存在~/.gradle/caches中。@PiyushJajoo查看我的更新答案。看来我错过了他们的一条关于记忆方式的公告!如果您使用embedded,请阅读:我无法从指定的repo获取此工件(
http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release
),并且它在任何其他系统上都不可用。我将发布一个单独的问题,但你知道为什么我下载时总是出错吗?这个repo是否平衡?这个答案可能有问题,如下所示:maven的当前版本是
1.10.20
@SridharSarnobat-Mulesoft似乎在他们的repo上托管了DynamoDbLocal: