我可以通过此命令从bash启动本地 DynamoDB服务器:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb &
在一个代码中是否没有纯java方式启动服务器?我并不是指通过Process
对象对shell进行java调用,而是当我运行我的应用程序时,服务器启动,当我的应用程序被杀死时,服务器被终止。
如果存在这样的模式,我可以使用嵌入式数据库,尽管反映服务器一致性语义的东西是理想的。
答案 0 :(得分:15)
编辑: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可以在同一个进程中启动,那就太好了。
这是一个简单的解决方法/解决方案,使用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
答案 1 :(得分: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)