11. januar 2007 - 01:33Der er
13 kommentarer og 1 løsning
Fejldetecte en server (RMI)
Er der nogen der ved hvordan jeg implementerer i RMI følgende:
Jeg har en server og en client. Hvis servere går ned skal min klient have besked om dette ( fejldetecter) Men kan ikke finde ud af om jeg skal lade min server udsende et "ALIVE" signal hver f.eks. 10'nde sekund eller jeg skal lade min klient forespørger servere om den er i live. Øhh hvad er egentlig bedst rent performace mæssigt( båndbredde ) ?
Jeg skal vel egentlig også implemntere noget callback og nogle tråde eller tager jeg helt fejl ?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
En exception. Dvs når min client efter 10 sekunder prøver at lave lookup på servere. Når den ikke svarer får jeg en en exception jeg griber ? Er det det du mener ?
Ok har kigget på det. Har lavet en tråd der lavet lookup hver 100 ms. Problemet er bare at når jeg ikke får svar så stopper min tråd helt. Det skulle gerne være sådan at når jeg ikke får svar(exception kastes) kan jeg kalde et metoder og foretaget noget andet. Helst en metode der er i klienten. Men har jo min tråd i en anden klasse
public class Node extends UnicastRemoteObject implements NodeMethods { static int NodeId = -1; // nodeID private List list;
public Node(int nodeId) throws RemoteException { setNodeId(nodeId); } public void receiveMessage(String message) { if(message.equals("election")) { System.out.println("election started"); } } public boolean isalive() { return true;
} public void register(MyClient c) { synchronized(list) { list.add(c); System.out.println("Number of clients: " + list.size()); } } public void unregister(MyClient c) { synchronized(list) { list.remove(c); System.out.println("Number of clients: " + list.size()); } }
public int add(int a, int b)throws RemoteException { System.out.println("Vi er blevet bedt om at lave en add"); return (a + b); } public int mul(int a, int b)throws RemoteException { System.out.println("Vi er blevet bedt om at lave en mul"); return (a * b); } public static void main(String[] args) { System.out.println("starting nodeID"); try { //Naming.rebind("node"+args[0], new Node(Integer.parseInt(args[0]))); Naming.rebind("node2", new Node(2)); } catch (RemoteException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); }
}
/** * @return Returns the nodeId. */ private int getNodeId() { return NodeId; }
/** * @param nodeId The nodeId to set. */ private void setNodeId(int nodeId) { NodeId = nodeId; } }
Jeg må indrømme at jeg ikke er så stærk på RMI, men jeg kan se at du ikke gør noget når du catcher en exception. Min forståelse er at når der kastes en exception stopper programmet der. Det vil sige at der skal laves en opsamling på hvor programmet var da det skete, og evt. skal der laves en ny forbindelse.
Spørgsmålet er om der overhovedet er brug for din tråd, da der i http protekoler er indbygget en timer.
Arne_v hvis du læser med kunne jeg godt tænke mig at hører din mening?
Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimeManager(highest,getNodeId()),0,1000);
public class TimeManager extends TimerTask { public TimeManager(int highest, int nodeId) { this.highest = highest; this.nodeId = nodeId; } public void run() { checkCoordinatorAlice(); // sker 1000 milisekund }
} Ny forbindelse ? Hvis en tråd stopper (Timer eller Thread) er det så muligt at starte den ( vel også stoppen den ) ?
private void setCoordinator(boolean isCoordinator) { this.isCoordinator = isCoordinator; } public static void main(String[] args) throws RemoteException { int a = Integer.parseInt(args[0]); try { Naming.rebind("node"+a, new Node(a)); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } }
}
Det jeg prøver at lave er
1) Når jeg prøver at kalde en Node( public Message isAlive(Message m)throws RemoteException ). Hvis der går for lang tid med svar dvs. timeout skal jeg udføre metoden initiateElection(). Hvis jeg heller ikke får svar når metoden isAlive kaldes, så antages det at Noden jeg prøver at lave lookup på at crashet og så skal jeg kalde metoden initiateElection().Men nu når jeg prøver at lave lookup når min Node er crashet så fanger jeg en RemoteException og mit program stopper. Det skulle gerne fortsættet
Det er fordi at du catcher en exception, udskriver det og gør ikke mere.
prøv at tilføje initiateElection(); til din catch af den exception ---------------------------------- catch (RemoteException e) { initiateElection(); e.printStackTrace(); } ----------------------------------
Jeg foreslår dog, hvis du laver det på den måde, at du laver en log som skriver til en tekst-fil eller lign, så du kan se hvormange gange det forkommer.
bare giv alle points til jime_boy - jeg har ikke bidraget med ret meget
Synes godt om
Ny brugerNybegynder
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.