Postgresql - détecter les changements et appel webservice
J'ai une base de données PostgreSQL. Ce que je veux faire, c'est de détecter tout changement (insert, update) qui se produisent dans la base de données et ensuite appeler un webservice. Comment pourrais-je faire cela?
Merci d'avance pour toute aide.
- Apache Camel propose également un PostgresSQL transport. Vous pouvez créer un itinéraire à l'aide de la JavaDSL. En combinaison avec d'AVISER, cela pourrait fonctionner.
- Liés à la question Notification postgres des modifications à l'application java
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure d'utiliser les déclencheurs et les listen/notify fonctionnalités de PostgreSQL pour obtenir quelque chose comme ceci:
Un ensemble de insert/update/delete les déclencheurs créer un événement de notification chaque fois que quelque chose change dans votre tableau, à l'aide de la créés/modifiés/supprimés ID de la charge utile.
Un processus d'arrière-plan des contrôles pour les notifications périodiques (voici un exemple d'utilisation de Java/JDBC), puis charge l'enregistrement modifié à partir de la base de données pour faire l'appel de service web.
Ce n'est en aucune façon un push en temps réel-système de type, mais vous devez interroger la base de données pour la notification des événements pour déclencher l'appel webservice. Il fera l'affaire, si.
SELECT 1;
. Si vous êtes à l'aide de client-côté d'interrogation vous pouvez interroger assez rapidement et c'est à peu près en temps réel. Cela fonctionne dans la plupart des langues de pilotes de base de données, et pas seulement PgJDBC.LISTEN
etNOTIFY
est certainement la bonne approche. Il est possible d'utiliser unplpythonu
,plperlu
, etc déclencheur pour faire des appels de service web à partir d'directement à l'intérieur de la base de données, mais (a) il n'est pas transactionnel et (b), il va faire des choses horribles à votre base de données de performances, en particulier si le service web est lent ou ne répond pas.SELECT pg_notify('channel', 'payload')
au lieu dePERFORM pg_notify('channel', 'payload')
-- PostgreSQL ne vous autorise pas à ignorer silencieusement le résultat d'un SELECT.NOTIFY message
directement, ce qui ne permet pas une variable nom de la chaîne. Aussi, le soutien à une charge utile n'a été ajouté dans la version 9.0, de sorte que vous aurez à faire sans. Cela rend @Craig suggestion de l'utilisation d'un tableau historique de plus de notifications de votre meilleur pari.