2015-06-02 8 views
12

sono in grado di lanciare un server di DynamoDB locale da bash attraverso questo comando:Come avviare DynamoDB locale a livello di programmazione?

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb & 

Non c'è un modo puro-java per avviare il server in uno di codice? Non intendo un callout java alla shell tramite l'oggetto Process ma un modo tale che quando eseguo la mia app, il server si avvia e quando la mia app viene uccisa, il server viene ucciso.

Posso vivere con un database incorporato se tale modalità esiste, anche se qualcosa che riflette la semantica della coerenza del server sarebbe l'ideale.

+2

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. –

+0

@PiyushJajoo vedere la mia risposta aggiornata. Sembra che mi sia sfuggito un annuncio da parte loro che annunciava il modo in-memory! – mkobit

+0

Se si utilizza incorporato, leggere: http://stackoverflow.com/questions/34137043/amazon-dynamodb-local-unknown-error-exception-or-failure/35353377#35353377 –

risposta

13

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 
+1

Non riesco a ottenere questo artefatto da il repository specificato ('http: // dynamodb-local.s3-website-us-west-2.amazonaws.com/release'), e non è disponibile su nessun altro. Pubblicherò una domanda a parte, ma non so perché continuo a ricevere errori scaricandolo? Anche questo repo è attivo? –

+0

Questa risposta potrebbe avere problemi, leggi: http://stackoverflow.com/questions/34137043/amazon-dynamodb-local-unknown-error-exception-or-failure/35353377#35353377 –

+0

la versione corrente in Maven è '1.10.20 ' –

0

Scrivi un compito Gradle per estrarre lo zip DynamoDB-locale e ora è possibile utilizzare https://github.com/marcoVermeulen/gradle-spawn-plugin plug Gradle per lanciare il DynamoDB locale. È molto facile da usare e non è necessario eseguire alcuna magia di processo.

codice di esempio -

// 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) 
Problemi correlati