编辑:2015年9月23日
2015年8月3日发布了一项公告,现在可以在同一进程中运行嵌入式DynamoDB本地实例。您可以添加一个Maven测试依赖项,并使用以下其中一种方式来运行它。
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>[1.11,2.0)</version>
</dependency>
</dependencies>
<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 {
dynamodb = DynamoDBEmbedded.create().amazonDynamoDB();
listTables(dynamodb.listTables(), "DynamoDB Embedded");
} finally {
if(dynamodb != null) {
dynamodb.shutdown();
}
}
final String[] localArgs = { "-inMemory" };
DynamoDBProxyServer server = null;
try {
server = ServerRunner.createServerFromCommandLineArgs(localArgs);
server.start();
dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();
listTables(dynamodb.listTables(), "DynamoDB Local over HTTP");
} finally {
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());
}
});