Nous faisons du travail de prototypage et nous vous demandons s'il est possible d'interrompre un fil qui a effectué un appel RMI. Si nous appelons l'interruption () sur ce thread, voudriez-vous lancer une interruptionException? (ou devrait-il?) Nos tests le montre actuellement pas. Je me demandais simplement comment cela devrait être. P>
4 Réponses :
Non, Vos options sont soit pour envoyer un autre appel RMI au serveur sur un thread séparé, qui vous demande il em> d'interrompre le traitement par programme (en supposant que le code côté serveur effectue une boucle interruptible de une sorte). P>
Effectuez alternativement l'appel RMI d'origine dans un fil séparé, que vous pouvez ensuite «supprimer» si nécessaire. Utilisation d'un interruption () code> ne fonctionnera pas ici, car RMI utilise le blocage
java.io code>, qui n'est pas interruptible. P>
java.util.concurant.executetorservice code> semblerait utile ici, car cela vous permet de soumettre une tâche et d'attendre une période finie pour que cela soit terminé. L'appel RMI ne serait pas interrompu, mais votre programme client pourrait toujours continuer. P>
Vous pouvez toujours mettre en œuvre votre propre SocketFactory pour permettre de simples threads.Interrupt () code> fonctionner (quelques centaines de lignes de code de code).
@Bestssss: Non, je ne vois pas comment. Java.io Code> Les sockets sont non interruptibles.
ceux obtenus par des canaux sont pratiquement. écriture code> par défaut n'est pas (LIRE IS, cependant), mais toujours facile à mettre en œuvre. Regardez
sun.nio.ch.socketAdaptor code>
Ceci semble être un RMI Caractéristique manquante em>. p>
Vous pouvez toutefois implémenter votre propre usine de prise à utiliser par RMI et Timeout les sockets. Je me souviens que certains de mes amis le faisaient manuellement, mais je viens de trouver bibliothèque interruptiblermi qui résout ce problème automatiquement . Donnez-lui un essai et s'il vous plaît dites-nous comment il fonctionne. P>
Le site Java.net a fermé. La plupart des projets open source précédemment hébergés sur java.net ont été déplacés.
Le Bibliothèque RMI interruptible fournit un mécanisme pour interrompre les appels RMI. Typiquement, lorsqu'un fil invoque une méthode RMI, le fil bloque jusqu'à ce que la méthode RMI renvoie. Si l'appel de la méthode prend trop de temps (par exemple, si le serveur RMI est occupé ou se bloque, ou si l'utilisateur souhaite annuler l'opération RMI), il n'existe aucun moyen facile d'interrompre le blocage de l'appel RMI et de retourner le contrôle de la RMI. . La bibliothèque RMI interruptible fournit cette fonctionnalité. p>
La bibliothèque est composée de deux composants clés: une rmisocketfactory et un filefactoire. Les appels RMI fabriqués sur un thread de la filefactive fournie à une interface RMI à l'aide de sockets à partir de la RMisocketFactory peuvent être interrompues en appelant le thread de thread () sur le fil du client. Donc, c'est vraiment facile à utiliser. Mais noter également sur le côté serveur que vous souhaiterez peut-être ajouter un appel à une méthode utilitaire pratique pour vous assurer que le thread actuel n'est pas un "zombie" ou un fil orphelin qui a déjà été "interrompu" par le client. p>
Arrêtez un serveur RMI Programmatiquement: strong> p>
Les serveurs RMI commencent un fil qui ne finit jamais. Ceci est pour que le serveur soit persistant jusqu'à fermer manuellement. Toutefois, vous pouvez fournir une méthode distante, Le fil d'arrêt, après deux (2) Deuxième retard, appels shutdown () code>, pour le serveur distant. Cette méthode commence un fil d'arrêt. Le fil d'arrêt reste en attente d'un
notifier (). Code> Lorsque le serveur termine tout traitement de nettoyage, il réveille le fil d'arrêt. P>
system.exit (0) code> pour mettre fin à la machine virtuelle Java. Le retard est de sorte que les messages du serveur au client initiateur complètent le voyage. P>
Le projet mentionné n'est plus disponible car le site Java.net est fermé. La plupart des projets open source précédemment hébergés sur java.net ont été déplacés.
Java.Util.ContCurrant est clairement une faute de frappe qui devrait être java.util.concurrent. p>
Mais plus important encore, je ne vois pas Java.Util.ConCurrent.Excutetorsservice n'importe où. Avez-vous voulu dire java.util.concurrent.excurrent.ExecutiveCompletService? P>
L'interruption est une chose et il n'est pas difficile de réaliser mais avoir une cohérence après l'interruption (l'interruption peut ou non peut ne pas interrompre le serveur, elle-même) est la partie difficile. Donc, probablement à un moment donné, vous commencerez à examiner le comportement de la transaction.
@betsss Merci! Nous avons déjà déjà un cadre de transaction autour de l'appel :) Tout ce dont nous avons besoin en ce moment est la capacité de couper cet appel RMI mort au milieu, et on dirait que nous allons utiliser cette bibliothèque.