2010-12-13 7 views
2

Ich habe vor kurzem mit der Arbeit an meinem ersten CORBA-Projekt begonnen. Ich denke, ich habe die grundlegenden Dinge, aber es gibt einige Dinge, die mir noch entgehen. Eines dieser Dinge ist, wie CORBA mehrere Aufrufe desselben Objekts bearbeitet.CORBA unklare Sachen

Angenommen, ich habe einen Client, der sich beim Server registriert und dann Arbeit erhalten kann. Der Server sendet Arbeit zu zufälligen Zeiten.

  • Werden alle diese Anrufe auf demselben Thread behandelt? Dies würde bedeuten, dass der Client während der Arbeit nichts empfangen kann. Wie könnte ich ihm in diesem Fall Multithread-Verhalten geben?

    • Oder auf der anderen Seite ist ein Thread launched für jeden eingehenden Anruf?. Muss ich in diesem Fall die allgemeinen Daten schützen, auf die bei jedem Anruf zugegriffen werden kann? Was ist eine gute Praxis, dies zu tun wäre,

Andere Sache Ich mag würde zu tun ist, mehrere Arbeiter zu schaffen, und haben sie Arbeit bekommen, aber in meiner Implementierung nur ein Arbeiter aktiv ist.

Unten:

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);    
     } 
    } 

Antwort

2

Threading-Optionen werden in dem CORBA-Standard nicht angegeben. Die einzige mögliche Konfiguration für Threading ist die POA-Richtlinie ThreadingPolicy. Mögliche Werte sind ORB_CTRL_MODEL oder SINGLE_THREAD_MODEL. Ersteres gibt nichts über das Threading an und die ORB-Implementierung entscheidet darüber, welches Threading-Modell verwendet werden soll. Letzteres garantiert, dass jede Anfrage, die ein Objekt empfängt (innerhalb desselben POA), serialisiert wird, so dass im Servant keine Re-Enrancy- oder Multi-Threading-Fähigkeiten implementiert werden müssen.

CORBA-Implementierer haben diese Einschränkung jedoch zur Kenntnis genommen und einige Standard-Standardrichtlinien implementiert, die auf andere Weise konfiguriert werden müssen (z. B. Programmoptionen über ORB.init() oder Konfigurationsdateien). Normalerweise können Sie drei verschiedene Richtlinien finden (wenn Sie ORB_CTRL_MODEL wählen):

  • Thread pro Anfrage: startet einen neuen Thread jede Anforderung.
  • Thread pro Client: Spawnt einen neuen Thread für jeden anderen Client.
  • Thread-Pool: Der ORB reserviert einen Pool von Threads vorab und verwendet sie, um alle Anforderungen zu bedienen.

Andere sind möglich, aber das sind die Gemeinsamkeiten. Natürlich werden Sie beide dazu zwingen, jede Art von Sperrstrategie zu verwenden, um gleichzeitige Clients zu unterstützen.

+0

Könnten Sie mir in einem Schnipsel zeigen, wie ein "Thread pro Anfrage" Verhalten einzustellen. Oder vielleicht zeigen Sie mir andere Ressourcen. –

+0

Dies hängt von der konkreten ORB-Implementierung ab, die Sie verwenden. Zum Beispiel die ORBacus-Implementierung (Sie können es hier lesen: http://documentation.progress.com/output/Iona/orbacus/4.3.4/using_orbacus/wwhelp/wwhimpl/common/html/wwhelp.htm?context=using_orbacus&file = init08.html) sagt: '-OAthread_per_client' wählt den Thread pro Clientmodell aus. Diese Option kann an den ORB im ORB übergeben werden.init() 'funktioniert als Befehlszeile Ihres Programms oder mit einer Konfigurationsdatei, wie Sie auch in der Dokumentation von ORBacus sehen können. Wie gesagt, es hängt jedoch von dem konkreten ORB ab, den Sie verwenden. –

Verwandte Themen