How to launch local DynamoDB programmatically?

后端 未结 2 600
清歌不尽
清歌不尽 2021-02-05 13:08

I am able to launch a local DynamoDB server from bash through this command:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedD         


        
2条回答
  •  独厮守ぢ
    2021-02-05 13:36

    EDIT: September 23rd 2015

    There was an announcement on Aug 3, 2015 that now adds the ability to have an embedded DynamoDB local running in the same process. You can add a Maven test dependency and use one of the ways below to run it.

    
    
        
           com.amazonaws
           DynamoDBLocal
           [1.11,2.0)
        
    
    
    
        
           dynamodb-local-oregon
           DynamoDB Local Release Repository
           https://s3-us-west-2.amazonaws.com/dynamodb-local/release
        
    
    

    And here is an example taken from the awslabs/aws-dynamodb-examples Github repository:

    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();
        }
    }
    

    Old answer

    Like you said, there is currently no built-in way from DynamoDBLocal or the SDK to do this right now. It would be nice if there was an embedded DynamoDBLocal that you could start up in the same process.

    Here is a simple workaround/solution using java.lang.Process to start it up and shut it down programmatically in case others are interested.

    Documentation for DynamoDBLocal can be found here and here are the current definition of the arguments:

    • -inMemory — Run in memory, no file dump
    • -port 4000 — Communicate using port 4000.
    • -sharedDb — Use a single database file, instead of separate files for each credential and region

    Note that this is using the most recent version of DynamoDBLocal as of August 5th, 2015.

    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
    

提交回复
热议问题