2011-03-20 8 views
0

J'ai un serveur où mon java application web et base de données serveur résident.Java - Comment envoyer une notification du serveur au client

Maintenant, les clients de mon application web sont de deux types:

  • ClientType1
  • ClientType2

Les deux peuvent accéder à la base de données.

ClientType1 stocke les données dans la base de données.

ClientType2 récupère les données de la base de données.

Mais le ClientType1 devrait commencer stocker les données dans la base de données lorsque le ClientType2 dit Démarrer.

Similairement ClientType1 doit cesser de stocker les données dans la base de données lorsque le ClientType2 dit Arrêtez

================== ============================================= =

Q1. Quelles sont les solutions à ce problème?

  • Voici les approches que je pensais de:

  • Créer une table dans la base de données ayant une colonne qui indique l'état Démarrer ou Arrêter et doit être réglé par ClientType2 la valeur de cette colonne. ClientType1 continuera à envoyer la requête à la base de données pour obtenir l'état de cette table et effectuer des opérations en fonction de l'état.

  • Appliquer ServerPush approche par laquelle le serveur gardera une connexion avec le ClientType1 vivant et envoie la demande à lui chaque fois qu'il reçoit la commande (Démarrer ou Arrêter) de la ClientType2 . Le problème avec cette approche est que le non. des prises ouvertes au serveur augmentera à mesure que l'augmentation du nombrede ClientType1

Répondre

0

Je ne considère pas vraiment la communication interprocessus par une base de données pour être une bonne approche. Le scénario typique est que le client s'enregistre auprès du serveur, ce qui le rend éligible pour recevoir des messages en utilisant un mécanisme basé sur socket.

Le client peut alors:

  • Demandez au serveur pour effectuer une opération de base de données au nom de celui-ci
  • Demande d'accès à la base de données

S'il y a que beaucoup de clients que le maintien une connexion ouverte sera un problème que vous pourriez soit initier une nouvelle connexion chaque fois que vous avez besoin de communiquer avec le serveur ou laisser le serveur offrir, par exemple, une sorte d'API REST que le serveur peut interroger.

+0

Pourriez-vous expliquer ce que vous entendez par "le client s'enregistre lui-même auprès du serveur". –

+0

@Yatendra, c'est le * client * initie le contact au * serveur * qui peut garder une file d'attente de tous les * clients *. Cette file d'attente peut être utilisée pour arbitrer l'accès à la base de données entre les clients. Par exemple, le serveur peut envoyer les commandes 'start' et' stop' aux clients de la file d'attente. En bref, vous pouvez appliquer le concept 'Listener' sur le réseau. –

0

Vous devriez utiliser une sorte d'Ajax pour cela car cela permet d'abstraire le "serveur peut appeler le client".

Choisissez une bibliothèque qui vous permet de garder une seule connexion ouverte et de faire plusieurs choses grâce à cette connexion.

+0

Je pense qu'une seule connexion ouverte ne peut servir qu'à un seul client. Donc, pour de nombreux clients, le serveur doit garder ouvertes diverses connexions (sockets) qui ne fonctionneront pas dans le cas où nous aurions beaucoup de clients. –

+0

Naturellement chaque client a besoin de sa propre connexion. C'est ainsi que fonctionne TCP/IP. Pour le scénario «de nombreux clients», vous devrez utiliser un serveur Web sous-jacent adapté à ce type d'utilisation - voir http://en.wikipedia.org/wiki/C10k_problem - voici les principaux commentaires des développeurs de Jetty sur cette question . http://markmail.org/message/ulfklgftht7lhcqu –

Questions connexes