2013-03-19 21 views
11

Ho un database PostgreSQL. Quello che voglio fare è rilevare eventuali modifiche (inserimento, aggiornamento) che si verificano nel database e quindi chiamare un webservice. Come potrei farlo?PostgreSQL - rileva le modifiche e chiamare webservice

Grazie in anticipo per qualsiasi aiuto.

+0

Apache Camel offre anche una PostgresSQL [trasporto] (http://camel.apache.org/transport.html). È possibile creare un percorso utilizzando [JavaDSL] (http://camel.apache.org/java-dsl.html). In combinazione con NOTIFY, questo potrebbe funzionare. – koppor

+0

questione connessa [Notifica Postgres modifiche applicazione java] (http://stackoverflow.com/q/18126178/873282) – koppor

risposta

8

Si dovrebbe essere in grado di utilizzare i trigger e la listen/notify functionality in PostgreSQL per ottenere qualcosa di simile:

  1. Un insieme di inserimento/aggiornamento/delete triggers creare un evento di notifica ogni volta che cambia qualcosa nella tabella, utilizzando il creato/modificato/ID cancellato come payload.

  2. Un processo in background controlla periodicamente le notifiche (here's an example using Java/JDBC), quindi carica il record modificato dal database per effettuare la chiamata al servizio web.

Questo non è in alcun modo un sistema push-tipo in tempo reale, ma si deve interrogare il database per gli eventi di notifica per attivare la chiamata webservice. Farà il trucco, però.

+1

client Java può fare lato client-solo polling per le notifiche, se non usano SSL. Vedere http://jdbc.postgresql.org/documentation/publicapi/org/postgresql/PGConnection.html#getNotifications(). Se si utilizza SSL, PgJDBC non può ricevere notifiche in modo asincrono e si deve eseguire il polling inviando una query vuota o un 'SELECT 1;'. Se stai utilizzando il polling lato client, puoi eseguire il polling abbastanza rapidamente ed è praticamente in tempo reale. Funziona nella maggior parte dei driver di database della lingua, non solo in PgJDBC. –

+0

BTW, usando 'LISTEN' e' NOTIFY' è sicuramente l'approccio giusto. E 'possibile usare un 'plpythonu',' plperlu', ecc trigger per rendere i servizi Web chiama da direttamente all'interno del database, ma (a) non è transazionale e (b) lo farà cose orribili per le prestazioni del database, soprattutto se il il servizio web è lento o non risponde. –

+0

Invece di utilizzare l'ID come il carico utile, però, mi consiglia la registrazione della crea, inserti e cancella a un tavolo la storia e solo l'invio di un carico utile, meno notificare che racconta il cliente che qualcosa è stato aggiunto alla tabella della cronologia. Molto più robusto e più veloce anche. –

Problemi correlati