J'ai récemment commencé à travailler sur mon premier projet CORBA. Je pense que j'ai les choses de base, mais il y a des choses qui m'échappent encore. Une de ces choses est de savoir comment CORBA gère plusieurs appels sur le même objet. Supposons que j'ai un client qui s'enregistre auprès du serveur, puis peut recevoir du travail. Le serveur envoie du travail à des moments aléatoires.CORBA choses peu claires
Tous ces appels sont-ils traités sur le même thread? Cela signifierait que pendant que le client travaille, il ne peut rien recevoir. Dans ce cas, comment pourrais-je lui donner un comportement multithread.
- Ou d'un autre côté, un thread est-il généré pour chaque appel reçu? Dans ce cas dois-je protéger les données communes accessibles à chaque appel? Quelle serait une bonne pratique de le faire
Autre chose que je voudrais faire est de créer plusieurs travailleurs et de les recevoir du travail, mais dans ma mise en œuvre qu'un seul travailleur est actif.
Ci-dessous:
public static void main(String[] args)
{
try
{
connectWithServer(args);
createWorkers();
// wait for invocations from clients
orb.run();
}
catch (Exception e)
{
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
static public void connectWithServer(String[] args)throws Exception
{
orb = ORB.init(args, null);
// get reference to rootpoa & activate the POAManager
rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// get the root naming context
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// Use NamingContextExt instead of NamingContext. This is
// part of the Interoperable naming Service.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// resolve the Object Reference in Naming
taskBagImpl = TaskBagHelper.narrow(ncRef.resolve_str(SERVER_NAME));
System.out.println(TAG + " Obtained a handle on server object: " + taskBagImpl);
}
public static void createWorkers() throws Exception
{
for(int i = 0; i < nrOfWorkers; i++)
{
WorkerImpl w = new WorkerImpl();
rootpoa.activate_object((Servant) w);
Worker ref = WorkerHelper.narrow(rootpoa.servant_to_reference(w));
w.setRef(ref);
taskBagImpl.registerWorker(w.getId(), ref);
}
}
Pourriez-vous me montrer dans un extrait comment définir un comportement "thread par demande". Ou peut-être me pointer d'autres ressources. –
Cela dépend de l'implémentation concrète de l'ORB que vous utilisez. Par exemple, l'implémentation d'ORBacus (vous pouvez le lire ici: http://documentation.progress.com/output/Iona/orbacus/4.3.4/using_orbacus/wwhelp/wwhimpl/common/html/wwhelp.htm?context=using_orbacus&file = init08.html) dit: '-OAthread_per_client' sélectionne le thread par modèle client. Cette option peut être transmise à l'ORB dans le 'ORB.init() 'fonctionne comme une ligne de commande de votre programme, ou en utilisant un fichier de configuration, comme vous pouvez le voir dans la documentation d'ORBacus aussi. Cependant, comme je l'ai dit, cela dépend de l'ORB concret que vous utilisez. –