Question

J'écris une application Java qui instancier des objets d'une classe pour représenter des clients qui se sont connectés et enregistrés avec un système externe de l'autre côté de ma demande.

Chaque objet client a deux classes imbriquées en son sein, ce qui représente la fin de l'avant et d'arrière-plan. la classe frontal recevra en continu des données du client réel et envoyer des indications et des données à la classe arrière-plan, qui prendra les données de la fin de l'avant et l'envoyer au système externe en utilisant le format approprié et le protocole ce système exige.

Dans la conception, nous cherchons à avoir chaque instanciation d'un objet client est un fil. Ensuite, dans chaque thread sera naturellement deux prises [EDIT] avec leurs propres canaux NIO chaque [/ EDIT], un côté client, un système côté résidant dans le front- et back-end respectivement. Cependant, cela introduit maintenant la nécessité pour les sockets non bloquantes. Je suis en train de lire le tutoriel qui explique comment utiliser en toute sécurité un sélecteur dans votre fil principal manipuler tous les fils de connexions.

Mais, ce que je dois sont multiples sélecteurs - fonctionnant chacun dans leur propre fil. À la lecture du tutoriel ci-dessus, je l'ai appris que les jeux clés dans un sélecteur ne sont pas threadsafe. Est-ce que cela signifie que Selectors séparés instanciés dans leurs propres fils RESPECTIFS peuvent créer des clés contradictoires si je tente de leur donner chacun leur propre paire de sockets et les canaux? Le déplacement du sélecteur jusqu'à le fil conducteur est une faible possibilité, mais loin d'être idéale en fonction des exigences du logiciel que j'ai donné. Nous vous remercions de votre aide.

Était-ce utile?

La solution

L'utilisation de plusieurs sélecteurs serait bien aussi longtemps que vous n'enregistrez pas le même canal avec les mêmes intérêts avec les deux instances de sélection (OP_READ / OP_WRITE etc). Enregistrement du même canal avec plusieurs instances de sélection pourrait causer un problème où selector1.select () pourrait consommer un événement qui selector2.select () pourrait être intéressé par.

Les sélecteurs par défaut sur la plupart des plates-formes sont poll () [ou epoll ()] en fonction.

Selector.select appelle en interne le int poll( ListPointer, Nfdsmsgs, Timeout) method.

        where the ListPointer structure can then be initialized as follows:

    list.fds[0].fd = file_descriptorA;
    list.fds[0].events = requested_events;
    list.msgs[0].msgid = message_id;
    list.msgs[0].events = requested_events;

Cela dit, je recommande l'utilisation d'un seul fil de sélection tel que mentionné dans le tutoriel RPC ROX nio. mises en œuvre NIO dépendent plate-forme, et il est tout à fait possible que ce qui fonctionne sur une plate-forme peut ne pas fonctionner sur un autre. J'ai vu des problèmes entre les versions mineures aussi. Par exemple, AIX 1.6 JDK SR2 utilisé un sélecteur à base de sondage () - PollSelectorImpl et le fournisseur de sélecteur correspondant que PollSelectorProvider, notre serveur a fonctionné très bien. Quand je suis arrivé à AIX JDK 1.6 SR5, qui a utilisé un sélecteur optimisé en fonction interface pollset (PollSetSelectorImpl), nous avons rencontré dans notre fréquents blocages serveur dans le select () et socketchannel.close (). L'une des raisons que je vois est que nous ouvrons plusieurs sélecteurs dans notre application (par opposition à l'idéal Sélection du modèle de fil) et la mise en œuvre du PollSetSelectorImpl comme décrit ici .

Autres conseils

Si vous devez utiliser cette connexion socket unique, vous devez séparer le processus de réception et de l'écriture des données depuis et vers le canal à partir des données de traitement lui-même. Vous ne devez pas déléguer le canal. Le canal est comme un bus. Le bus (le fil unique, qui gère le canal) doit lire les données et écrire dans une file d'attente d'entrée (thread-safe), y compris les informations nécessaires, de sorte que votre thread client (s) peut ramasser le paquet Datagram correct à partir de La queue. Si le thread client aime écrire des données, que les données sont écrites dans une file d'attente de sortie qui est ensuite lu par le fil des canaux pour écrire les données sur le canal.

Donc, d'un concept de partage d'une connexion entre les acteurs qui utilisent ce lien avec leur temps de traitement imprévisible (ce qui est la principale raison de blocs), vous passez à un concept de données asynchrones lues, le traitement des données et l'écriture de données. Donc, ce n'est pas le temps de traitement qui est plus imprévisible, mais le temps, vos données sont lues ou écrites. des moyens non-blocage, que le flux de données est aussi constant que possible, en dépit de ce temps est nécessaire pour traiter ces données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top