EDIT: 23 Settembre 2015
C'è stato un annuncio su Aug 3, 2015 che ora aggiunge la possibilità di avere un locale in esecuzione incorporato DynamoDB nello stesso processo. È possibile aggiungere una dipendenza di test Maven e utilizzare uno dei modi seguenti per eseguirlo.
<!--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>
E qui è un esempio tratto dal repository 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();
}
}
Vecchio risposta
Come hai detto tu, non v'è attualmente alcun modo integrato da DynamoDBLocal o SDK per farlo adesso. Sarebbe bello se ci fosse un DynamoDBLocal integrato che potresti avviare nello stesso processo.
Ecco una semplice soluzione/soluzione che utilizza java.lang.Process
per avviarlo e chiuderlo a livello di programmazione nel caso in cui altri siano interessati.
documentazione per DynamoDBLocal può essere trovato here e qui sono l'attuale definizione degli argomenti:
-inMemory
- Esegui in memoria, nessun file di dump
-port 4000
- Comunicare utilizzando la porta 4000.
-sharedDb
- Utilizzare un singolo file di database, invece di file separati per ogni credenziale e regione
Si noti che questa sta utilizzando la versione più recente di DynamoDBLocal a partire dal 5 agosto 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
ho esattamente lo stesso caso d'uso. L'opzione "Processo" funziona anche per me, ma come faccio a trovare il jar nel classpath, in modo programmatico. Voglio dire il barattolo e le sue dipendenze sono all'interno di un file zip, che viene memorizzato nella cache in ~/.gradle/cache. –
@PiyushJajoo vedere la mia risposta aggiornata. Sembra che mi sia sfuggito un annuncio da parte loro che annunciava il modo in-memory! – mkobit
Se si utilizza incorporato, leggere: http://stackoverflow.com/questions/34137043/amazon-dynamodb-local-unknown-error-exception-or-failure/35353377#35353377 –