Corba неблокирующая сфера
Я пытаюсь сделать программу Corba, реализованную с использованием Java, который в то же время является сервером для другой Java-программы и клиентом для другой, поэтому мне нужен неблокирующий шар, который можно запустить в отдельном потоке (он у меня в моем классе Orb_run): но у меня есть проблема при создании экземпляра Orb_run, я должен предоставить объект ORB, но если я вызову метод init на шаре, он создаст новый объект bkocking, вот код моего сервера,
public class machine {
static int uid = 1;
etat_machine etat;
static ORB orb;
static int token_uid = 1;
static void server(String[] args, int uid, int token_uid){
try {
//Instanciate Orb obj
//orb = ORB.init(args, null);
//Instancier Orb_run
Orb_Run orb_run = new Orb_Run(orb);
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
machineImpl machine = new machineImpl(poa, uid, jeton_uid);
// create the object reference
org.omg.CORBA.Object mach = poa.servant_to_reference(machine);
try {
String m1_ref = orb.object_to_string(mach);
String refFile = "m1.ref";
PrintWriter out = new PrintWriter(new FileOutputStream(refFile));
out.println(m1_ref);
out.close();
}
catch (IOException ex) {
System.err.println(
"Impossible d'ecrire la reference dans m1.ref");
System.exit(1);
}
System.out.println("Le serveur m1 est pret ");
// wait for requests
orb_run.run();
System.exit(0);
}
catch (Exception e) {
System.out.println(e);
}
//Client
public static int client(int token_uid){
orb.init();
// Orb_Run orb_run = new Orb_Run(orb);
String ior = null;
try {
String ref = "m2.ref";
FileInputStream file = new FileInputStream(ref);
BufferedReader in = new BufferedReader(new InputStreamReader(file));
ior = in.readLine();
file.close();
} catch (IOException ex) {
System.err.println("Impossible de lire fichier : '" +
ex.getMessage() + "'");
System.exit(1);
}
org.omg.CORBA.Object obj = orb.string_to_object(ior);
if (obj == null) {
System.err.println("Erreur sur string_to_object() ");
throw new RuntimeException();
}
machine machine = machineHelper.narrow(obj);
if (machine == null) {
System.err.println("Erreur sur narrow() ");
throw new RuntimeException();
}
System.out.println("avant appel traitement_message ");
jeton_uid = machine.traitement_message();
System.out.println("le uid ds le jeton mnt"+ jeton_uid);
return jeton_uid;
}
}
Я запускаю неблокирующий шар в отдельном потоке, используя этот класс:
public class Orb_Run extends Thread {
public ORB orb_;
public Orb_Run(ORB o) {
orb_=o;
}
public void run() {
System.out.println("Le serveur est pret");
orb_.run();
} } }
Так что, если у вас есть несколько советов, как это сделать, это будет здорово.
Благодарю.
3 ответа
Я не знаю ни одного способа запустить неблокирующую ORB, используя стандартные API в Java. Можно ли вместо этого создать новый поток для запуска ORB, а затем продолжить работу в основном потоке? Или порождают рабочие потоки для работы клиента и используют основной поток для ORB?
Просто не выполняйте orb_run.run();
Так как этот метод предназначен для блокировки текущих потоков....
Тем не менее, в Java 7 метод ORB.run() фактически выполняет бесконечное ожидание; рабочий поток запускается независимо от ORB.run() . Так что вам вообще не нужно его называть, и у вас есть отличный неблокирующий ORB.