Par exemple, j'ai un client de confiance et un serveur. Le client veut exécuter du code arbitraire sur le serveur. Est-ce possible en utilisant RemoteActor (sérialiser une fonction et l'envoyer sur le réseau, la désérialiser et l'exécuter)?Est-il possible d'exécuter du code arbitraire sur un noeud distant à l'aide de RemoteActor?
Répondre
Pas actuellement. Sérialiser une fonction signifie stocker ses champs dans un flux de sortie d'objet et désérialiser cela signifie lire l'objet de fonction à partir d'un flux d'entrée d'objet ailleurs. La désérialisation suppose que la classe de l'objet lu dans le flux d'entrée de l'objet est connue de la JVM. Rappelez-vous - les fonctions sont juste des objets derrière la scène.
Dans ce cas, le serveur ne connaît pas la classe concrète réelle de l'objet fonction que vous êtes en train de sérialiser, il est possible qu'il implémente l'interface Function
. Pour prendre en charge une telle fonctionnalité, vous devez localiser le fichier de classe de la fonction en question, l'envoyer au serveur et le charger sur le serveur en utilisant un classloader personnalisé. Ensuite, si l'objet a un état quelconque, vous pouvez sérialiser l'objet sur le client, l'envoyer sur le réseau et le désérialiser sur le serveur. Alors seulement pouvez-vous exécuter ses méthodes. En supposant que vos objets de fonction sont sans état, ce qui est généralement le cas, vous pouvez ignorer l'étape de sérialisation/désérialisation.
EDIT:
Rappelez-vous aussi que les fonctions peuvent détenir en interne des références à leur environnement d'appel. Cela signifie que vous pourriez finir par sérialisation l'environnement d'un objet de fonction avec elle, ce qui peut potentiellement être votre ensemble des données du programme ..
Voici un example d'utiliser URLClassLoader avec des acteurs distants, iront chercher les classes via http du client et exécuter des calculs génériques sur le serveur.
Vous pouvez également être intéressé par HotSwap technique appliqué à sérialisable Akka Actors.
Mais la sérialisation ne stocke que les valeurs de champ de la fonction dans le flux. La redéfinition de la méthode 'apply' est spécifique à la classe anonyme implémentant l'interface' Function'. Le code réel dans la méthode redéfinie 'apply' d'une classe anonyme n'est pas sérialisé, si ma compréhension est correcte. Droite? Dans ce cas, comment l'acteur distant sur le serveur connaîtra-t-il le corps de la méthode 'apply' qui n'est connue que chez le client? – axel22
D'accord, ont trouvé un fil conducteur sur ce sujet: http://scala-programming-language.1934581.n4.nabble.com/Passing-functions-to-remote-actor-td2991157.html –