如何以编程方式启动本地 DynamoDB?
How to launch local DynamoDB programmatically?
我可以通过以下命令从 bash 启动 local DynamoDB 服务器:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &
难道没有一种纯粹的java方式来在自己的代码中启动服务器吗?我的意思不是通过 Process
对象对 shell 的 java 标注,而是一种方式,当我 运行 我的应用程序时,服务器启动,当我的应用程序启动时被杀死,服务器被杀死。
如果存在这种模式,我可以使用嵌入式数据库,尽管反映服务器一致性语义的东西是理想的。
编辑:2015 年 9 月 23 日
Aug 3, 2015 上发布了一个公告,现在添加了在同一进程中嵌入 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 就好了。
这是一个简单的 workaround/solution 使用 java.lang.Process
以编程方式启动和关闭它以防其他人感兴趣。
可以找到 DynamoDBLocal 的文档here,这里是参数的当前定义:
-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
编写一个 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)
我可以通过以下命令从 bash 启动 local DynamoDB 服务器:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &
难道没有一种纯粹的java方式来在自己的代码中启动服务器吗?我的意思不是通过 Process
对象对 shell 的 java 标注,而是一种方式,当我 运行 我的应用程序时,服务器启动,当我的应用程序启动时被杀死,服务器被杀死。
如果存在这种模式,我可以使用嵌入式数据库,尽管反映服务器一致性语义的东西是理想的。
编辑:2015 年 9 月 23 日
Aug 3, 2015 上发布了一个公告,现在添加了在同一进程中嵌入 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 就好了。
这是一个简单的 workaround/solution 使用 java.lang.Process
以编程方式启动和关闭它以防其他人感兴趣。
可以找到 DynamoDBLocal 的文档here,这里是参数的当前定义:
-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
编写一个 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)