RMID multiples activation process problème
Bonjour,
J'utilise RMID pour activer des process indépendants Java, qui dérivent d'une même classe Activable, mais qui sont enregistrés sous des noms différents dans le registre RMI (le même port est par contre utilisé).
Mon problème est qu'après un certain temps ou des fois immédiatement après le lancement des services activables, plusieurs process existent,souvent 2 par objet Activable (un avec les propriétés de l'environnement et un autre avec les "properties" attendues qui sont différentes pour chaque objet Activable), et d'autres process apparaissent comme s'ils étaient instanciés à partir d'un objet Activable déjà associé à un process existant,....
Le code que j'utilise pour enregistrer mes objets Activable dans le rmiregistry :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
public static void main(String[] args) throws Exception {
// Instanciate a custom Security Manager
System.setSecurityManager(new MySecurityManager());
// Set every environment variables in properties, as well as the
// security policy that shall be added even if a Security Manager has
// been instanciated before
ActivationGroupDesc.CommandEnvironment ace = null;
Properties props = new Properties();
props.put("java.security.policy", System.getenv("MY_HOME") + File.separator + "resources" + File.separator
+ "AllPermissionPolicy");
// The "location" String specifies a URL from where the class
// definition will come when this object is requested (activated).
// Don't forget the trailing slash at the end of the URL
// or your classes won't be found.
String location = System.getProperty("java.rmi.server.codebase");
// The location argument to the ActivationDesc constructor will be used
// to uniquely identify this class; it's location is relative to the
// URL-formatted String, location.
MarshalledObject data = null;
ActivationSystem localActivationSystem = ActivationGroup.getSystem();
// Variables declaration
ActivationGroupID agi = null;
ActivationDesc desc = null;
ActivationGroupDesc groupDesc = null;
try {
// FOR EACH project
File[] projects = (new File(System.getenv("MY_CONF"))).listFiles();
for (int p = 0; p < projects.length; p++) {
if (!projects[p].isFile()) {
String project = projects[p].getName();
File[] subprojects= projects[p].listFiles();
// FOR EACH subproject
for (int m = 0; m < subprojects.length; m++) {
if (!subprojects[m].isFile()) {
String subproject = subprojects[m].getName();
String lookupName = project + subproject + "MyActivableObject";
props.put("PROJECT", project);
props.put("SUBPROJECT", subproject);
// Activation Group Descriptor
groupDesc = new ActivationGroupDesc(props, ace);
agi = localActivationSystem.registerGroup(groupDesc);
// The activation group is what creates the activable object in a JVM
// Sets the activation group for the current JVM
//ActivationGroup.createGroup(agi, groupDesc, 0);
// Once the ActivationGroupDesc has been created, register it
// with the activation system to obtain its ID
desc = new ActivationDesc(agi, "example.MyActivableObject", location, data);
// Register with rmid
MyActivableObjectInterface mri = (MyActivableObjectInterface) Activatable.register(desc);
// Bind the stub to a name in the registry
Naming.rebind("//" + InetAddress.getLocalHost().getHostName() + ":" + MY_RMI_PORT + "/" + lookupName,
mri);
System.out.println(project + "\t" + subproject+ "\tMyActivableObject done.");
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
System.err.println("Failed to set up start services. " + e.getMessage());
}
System.exit(0);
} |
Pouvez-vous me dire ce qui ne va pas dans ce code, sachant que mon but est d'avoir un minimum de process vivants (un process par "subproject", indépendant à chaque fois des autres, et qui peut être activé et tué autant de fois que voulu) ?
Merci d'avance pour votre aide,
Eva