Hey,
ich habe ein Projekt bei dem Funktionen mit Antlr4 geparsed werden und dann damit gerechnet werden kann und die Funktionen integriert und differenziert werden können.
Im nächsten Schritt soll das jetzt auch über einen Dienst laufen:
Habe also das Interface:
Dazu der Server, der das Interface implementiert:
Der Client sieht so aus:
Das Script liest erst eine Funktion ein und speichert die in einer Hashmap. Mit der getFunction() Methode hol ich mir dann ein Funktionsobjekt.
Die Funktionen-Klasse:
Wenn ich jetzt versuche, die Funktion über RMI differenzieren zu lassen, kommt leider der schon im Titel erwähnte Fehler.
"Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy1 cannot be cast to Funktionen"
Im Stacktrace ist der letzte "Trace" in meinem Code diese Zeile im Client:
Danach nur noch RMI, was ich nicht wirklich nachvollziehen kann.
Ich hab schon viel gegoogelt und es wird gesagt, dass man gg ein Interface programmieren soll, aber das habe ich ja eig. gemacht mit:
Wenn ich einen String übergebe, und das Parsen etc auf der Serverseite mache, dann klappt alles wunderbar.
Hoffe mir kann da jemand helfen, sodass ich auch ein Funktionenobjekt übergeben kann.
Grüße
ich habe ein Projekt bei dem Funktionen mit Antlr4 geparsed werden und dann damit gerechnet werden kann und die Funktionen integriert und differenziert werden können.
Im nächsten Schritt soll das jetzt auch über einen Dienst laufen:
Habe also das Interface:
Java:
public interface Service<T,A,R> extends java.rmi.Remote {
String getName() throws java.rmi.RemoteException;
R execute(T task,A ... args) throws java.rmi.RemoteException;
}
Dazu der Server, der das Interface implementiert:
Java:
public class DifferentiatorService extends java.rmi.server.UnicastRemoteObject
implements Service<Funktionen, Double, Double> {
/**
*
*/
private static final long serialVersionUID = -3236697150408344006L;
protected DifferentiatorService() throws RemoteException {
}
@Override
public String getName() throws RemoteException {
return "DifferentiatorService";
}
@Override
public Double execute(Funktionen f, Double... args) throws RemoteException {
Differentiator diff = new Differentiator();
double result = diff.differentiate(f, args[0]);
return result;
}
public static void main(String[] args) throws Exception {
String url = "//localhost/DifferentiatorService";
Registry registry = LocateRegistry.createRegistry(1099);
DifferentiatorService service = new DifferentiatorService();
Naming.rebind(url, service);
System.out.printf("Service %s registered\n", url);
}
}
Der Client sieht so aus:
Java:
public class DifferentiatorClient {
public static void main(String[] args) throws RemoteException, MalformedURLException, IllegalArgumentException, NotBoundException, RecognitionException {
execute();
}
public static Double execute() throws RemoteException, MalformedURLException, NotBoundException, IllegalArgumentException, RecognitionException {
Service<Funktionen, Double, Double> service;
String url = "//localhost/DifferentiatorService";
Double r;
String text = "f(x)=x^2";
Script script = new Script();
script.parse(text);
Funktionen f = script.getFunction("f");
service = (Service<Funktionen, Double, Double>) Naming.lookup(url);
r = service.execute(f, (double)2);
return r;
}
}
Das Script liest erst eine Funktion ein und speichert die in einer Hashmap. Mit der getFunction() Methode hol ich mir dann ein Funktionsobjekt.
Die Funktionen-Klasse:
Java:
public class Funktionen extends UnicastRemoteObject implements Function, Serializable {
/**
*
*/
private static final long serialVersionUID = -1234132759512350836L;
//viel Code
}
Wenn ich jetzt versuche, die Funktion über RMI differenzieren zu lassen, kommt leider der schon im Titel erwähnte Fehler.
"Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy1 cannot be cast to Funktionen"
Im Stacktrace ist der letzte "Trace" in meinem Code diese Zeile im Client:
Java:
r = service.execute(f, (double)2);
Ich hab schon viel gegoogelt und es wird gesagt, dass man gg ein Interface programmieren soll, aber das habe ich ja eig. gemacht mit:
Java:
service = (Service<Funktionen, Double, Double>) Naming.lookup(url);
Wenn ich einen String übergebe, und das Parsen etc auf der Serverseite mache, dann klappt alles wunderbar.
Hoffe mir kann da jemand helfen, sodass ich auch ein Funktionenobjekt übergeben kann.
Grüße
Zuletzt bearbeitet: