Avatar billede thomses Nybegynder
07. januar 2007 - 03:05 Der er 15 kommentarer og
1 løsning

Lidt hjælp til programmerings opgave i JavaRMI

Hej jeg vil gerne have lidt hjælp til en programmeringsopgave.
Jeg skal implementere Bully Algoritme. dvs en distribueret algoritme der fungerer i et distribueret netværk. Algoritmen betår af forskelige processer der kører på forskellig maskiner. Jeg kan dog simplificere dette ved, at lade mine proesser køre på den samme maskine(har kun en PC), så længe de er i seperate adresse rum/space.

Hvordan simulerer man det i JavaRMI. Jeg kan godt have flere klienter og servere kørende, med de kører vel alle samme under den samme JVM og i det samme adresserum ? Nogle ideer ?
Avatar billede arne_v Ekspert
07. januar 2007 - 03:17 #1
nej

RMI er mellem forskellige JVM = forskellige processer = forskellige adresserum

du kan starte:
  rmiregistry
  N processer

hver process fungerer som server og som client op mod de andre servere
Avatar billede thomses Nybegynder
07. januar 2007 - 11:08 #2
arne TUSINDE tak for dit svar :-)
Avatar billede thomses Nybegynder
11. januar 2007 - 00:42 #3
øhhh skal du ikke smide et svar Arne ?
Avatar billede arne_v Ekspert
11. januar 2007 - 01:34 #4
kommer her
Avatar billede thomses Nybegynder
13. januar 2007 - 02:33 #5
Arne tillader mig at spørge lidt mere.
Har virkelig ligget søvnløs over den her problematik.
Jeg skal lave den her BullyAlgoritme. Problemet er bare at jeg hveren har en server eller en client. Mit program er en Node, der kan kommuninere med de andre noder i mit distribuerede system. Hver node har et ID( som den får definere via main - args[])
Så det jeg gør er at have en instans af en masse Noder der indbyrdes skal kunne kommunikere. For at kunne kommunikere skal der vel være callback i RMI ? MEN ved callback sender jeg klientens classnavn over som parameter ?. Mit problem er så at hvis jeg gør det så sender jeg parameteren (Node) over till serveren som også er en klasse af type MODE. Det er her filmen knækker. Jeg har seriøst ikke en ide om hvad jeg kan gøre for at undgår dette problem
Tillader mig at smide min kode ( som dog virker uden brug af RMI) Så kan man da se hvad jeg mener kodemæssigt.


package alm;
import java.io.IOException;
public class Bully
{
public static void main(String[] args) throws IOException
{
    final int n = 9;
    final int [] value = {11,9,17,6,15,19,2,12,7};
    Participant[] part = new Participant[n];// array af typen
    MessageQueue[] q = new MessageQueue[n];

    for(int i=0;i<n;i++)
    {
        part[i]=new Participant();
        part[i].value=value[i];
        q[i]=new MessageQueue(10);
    }

    for(int i=0;i<n;i++)
    {
        part[i].inbox=q[i];
        part[i].neighbour=new MessageQueue[n];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {   
            part[i].neighbour[j]=part[j].inbox;
        }
    }

    for(int i=0;i<n;i++)
    {
        part[i].start();
    }

    try{Thread.sleep(500);}catch(Exception e){}

    for(int i=0;i<n;i++)
    {
        part[i].interrupt();
    }

    for(int i=0;i<n;i++)
    {
        if(part[i].boss!=null)
        System.out.println(part[i].value + " boss is " + part[i].boss.value);
    }
    }
}

    package alm;
   
    public class Message
    {
        String type;
        Participant candidate;
        Message (String t, Participant p)
        {
          type=t;
          candidate=p;
        }
    }

package alm;

public class MessageQueue
{
    int entries;
    int maxEntries;
    Object[] elements;// array

      public MessageQueue(int m)
      {
          maxEntries=m; //
          elements=new Object[maxEntries];// array af type object med max entries 
          entries=0;
      }

      synchronized void send(Object x)throws InterruptedException
      {
      while(entries==maxEntries)wait();
      elements[entries]=x;
      entries=entries+1;
      notifyAll();
      }

      synchronized Object receive()throws InterruptedException
      {
          while(entries==0)wait();
          Object x; x=elements[0];
          for(int i=1; i<entries; i++)
          {
              elements[i-1]=elements[i];
          }

      entries=entries-1;
      notifyAll();// tilæhørede tråd
      return x;
      }
}

package alm;
public class Participant extends Thread{

  MessageQueue inbox;
  MessageQueue[] neighbour;
  int value;
  Participant boss;
  Participant me;

  public void run()
  {
      boss=this;
      me=this;

      (new Thread(){public void run(){

        for(int i=0;i<neighbour.length;i++)

            try{

              neighbour[i].send(new Message("election",me));

            }catch(Exception e){}}}).start();

      try{for(;;){

      Message m=(Message)inbox.receive();

      System.out.println(value + " receives "+ m.type+ " " + m.candidate.value);

      if(m.type=="election"){
          if(m.candidate.value>boss.value) boss=m.candidate;
      }

      }}catch(Exception e){}

  }

}
Avatar billede arne_v Ekspert
13. januar 2007 - 04:52 #6
for det første sender du aldrig det rigtige objekt med over - du sender et
proxy objekt (en stib) for det rigtige objekt over

med hensyn til "alle er lige" problemet, så har du vel 3 muligheder:
1) topologien er statisk defineret via konfigurations filer
2) topologien detected automatisk via noget multicast
3) der er en koordinations server som alle connecter til og får topologi fra
Avatar billede thomses Nybegynder
13. januar 2007 - 14:58 #7
Arne TUSINDE tak for dit svar. Nogle gange kan man bare ikke se skoven for bare træer.

Med hensyn til 3) Det er vel dynamisk classloading du tænker på. Dvs hver client downloader de stubbe den skal bruge for at kalde remote objekter
Avatar billede arne_v Ekspert
13. januar 2007 - 16:09 #8
nej ikke helt jeg vill bare lave en RMI server med 2 metoder registerMe og giveMeAllNodes
som alle noderne så brugte til at finde ud af hvem de kan snakke med
Avatar billede thomses Nybegynder
13. januar 2007 - 16:27 #9
Fantastisk. Så mangler jeg lige at få lavet en Failure Detector, så kan jeg komme rigtig gang med at programmere.

Hvis jeg spørger pænt kan jeg så få dig til at kigge på spørgsmål
http://www.eksperten.dk/spm/755274
Avatar billede thomses Nybegynder
13. januar 2007 - 20:43 #10
Hej Arne
Så har jeg lavet en RegisterServer med metoderne

public synchronized List giveMeAllNodes()throws RemoteException
register(Node n)
unregister(Node n)

Når jeg nu laver et lookup(dvs en client) på den her server får clienten en List retur
indeholdende objekter. Når så min node1 f.eks vil kalde alle de andre noder, kan jeg så traversere min liste og kalder alle de objekter der er i denne liste ?

I så fald betyder det vel at jeg vil have en server - RegisterServer og alle mine Noder som er klienter. Så når jeg vil starte en Node skal jeg lave lookup på RegisterServer og derved får jeg alle remotobjekter på alle de Noder der har registreret sig på serveren. Skal hver Node så ikke registrere sig i rmiregistry for at modtage kald fra andre klienter ?
Avatar billede arne_v Ekspert
13. januar 2007 - 21:17 #11
du lader alle noderne registrere sig i rmiregistry

du lader alle noderne sende deres IP adresse til "server"

all noderne henter så alle IP adresserne fra "server" og connecter til hinanden
Avatar billede thomses Nybegynder
13. januar 2007 - 21:36 #12
Ok på på den måde. Meenn øhh jeg har jo ikke forskellige Ip adresser, da jeg desværre kun har en computer, kører ren localhost :-(
Avatar billede arne_v Ekspert
13. januar 2007 - 21:37 #13
ikke noget problem

de sender bare det navn som de registerer sig under i rmiregistry så
Avatar billede thomses Nybegynder
13. januar 2007 - 21:44 #14
Arne>> :-) så skal jeg bare lige igang med at får det hele til at spille :-)
Avatar billede thomses Nybegynder
19. januar 2007 - 11:54 #15
arne smider du ikk et svar.
Avatar billede arne_v Ekspert
19. januar 2007 - 14:56 #16
det gjorde jeg for en uge side - og det er ogsaa accepteret - saa all set
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester