RMI RMI Exceptions

SegFault

Bekanntes Mitglied
Bisher dachte ich das es reicht eine Exception von RemoteException ab zu leiten und diese in der IMPL klasse des Interfaces zu werfen. Scheinbar liege ich da falsch oder?
Es wird grundsätzlich nur eine RemoteException geworfen. Mit getCause() Komme ich an die innenliegende Exception ran. Wie prüfe ich sowas am günstigsten ab. Meine Funktion kann bis zu 3 Verschiedene Exceptions werfen. Sollte ich die alle mit instanceof prüfen? Oder gibts möglichkeiten eine auftretende RemoteException sofort wieder "umzuwandeln" und den richtigen Fehler im try{}catch Block zu fangen.
 
S

SlaterB

Gast
try {

} catch(SpecialRemoteException) {
..
} catch(RemoteException) {
..
}

müsste gehen, wenn man es macht,
deklarieren muss man die SpecialRemoteException nicht, geht aber auch,
beides optional

ansonsten eben nicht von RemoteException erben sondern von Exception, dann ist eigene throws-Deklaration + catch Pflicht
 

SegFault

Bekanntes Mitglied
Dann muss der Fehler woanders liegen. Denn ich hab das genau so gemacht wie du gesagt hast.

Ich hab irgendwo eine Klasse
Java:
LoginException extends RemoteException{ ... }

und werfe dann diese LoginException dummerweise kommt aber nur eine RemoteException an. Ggf könnte es daran
liegen das die IMPL Methode ein Spring DAO ist. Und dort irgendwas vermodelt wird.
 

SegFault

Bekanntes Mitglied
RMI verschluckt die Exception keine Ahnung warum. Hier ein Beispiel:
Java:
try
		{
			LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
			Registry reg = LocateRegistry.getRegistry();
			WerkstattService lm = (WerkstattService)ServiceUtil.getAppContext().getBean("WerkstattService");
			WerkstattService stub = (WerkstattService)UnicastRemoteObject.exportObject(lm,0);
			lm.login("blah", "blubb");
			reg.rebind("Werkstatt-Serv", stub);
			logger.info("Done");
		}
		catch ( LoginException ex )
		{
			logger.error("LoginException: "+ex.getMessage(),ex);
		}
		catch ( Exception ex )
		{
			
			logger.error("Fehler beim starten des Services: "+ex.getMessage(),ex);
		}
mache ich statt des lm.login() ein stub.login() wird nur eine RemoteException geworfen anstatt eine LoginException. In der RemoteException ist die LoginException enthalten, mache ich noch etwas falsch.
 
S

SlaterB

Gast
vielleicht hat der stub ein catch und fängt alles ab,
kommt eine von Login geworfene new RemoteException() direkt an, oder wird die auch in einer anderen RemoteException versteckt?

allgemein kann ich dazu aber nichts weiter sagen
 

SegFault

Bekanntes Mitglied
eine einzelne RemoteException wird auch in eine andere Verprackt. Ggf tritt es wegen der doppelten Interface verwendung auf? mit getBean(...) bekomme ich ja nur ein interface, welches ich dann per unicast... exportiere ansonsten müsste eine IMPL klasse schreiben die im grunde nur die gleichnamigen methoden des entsprechenden Interfaces aufruft.
 

SegFault

Bekanntes Mitglied
es hat definitiv nichts mit der doppelten interface definition zu tun. Ich hab jetzt mal direkt ein klasse gemacht:
Java:
public class WerkstattServiceImpl extends UnicastRemoteObject implements WerkstattService
{
@Override
	public synchronized WerkstattDbSession login(final String username,final String password) throws LoginException,WerkstattDataException,RemoteException
	{
		throw new LoginException("test");
		//return interior.login(username, password);
	}
}
Das interface
Java:
public interface WerkstattService extends Remote
{
	public WerkstattDbSession login(String username, String password) throws LoginException,WerkstattDataException,RemoteException;
	public Kundenverwaltung getKundenverwaltung(WerkstattDbSession session) throws RemoteException,SessionException,RightsException;
	public Nutzerverwaltung getNutzerverwaltung(WerkstattDbSession session) throws RemoteException,SessionException,RightsException;
}
und letzendlich das binden
Java:
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
Registry reg = LocateRegistry.getRegistry();
WerkstattServiceImpl wimpl = new WerkstattServiceImpl();
reg.rebind("Werkstatt-Serv", wimpl);
logger.info("Done");
Auf clientseite:
Java:
Registry reg = LocateRegistry.getRegistry(url, port);
service = (WerkstattService)reg.lookup("Werkstatt-Serv");
try 
{
	session = service.login(lw.getName(), lw.getPassword());
	return true;
} 
	catch (LoginException e) 
{
	JOptionPane.showMessageDialog(null, "Fehlerhafter Login");
}
catch (Exception e) 
{
        JOptionPane.showMessageDialog(null,"Probleme beim Login:"+e.getMessage(),"Fehler",JOptionPane.ERROR_MESSAGE);
         logger.log(new Status(IStatus.ERROR,WerkstattClientActivator.PLUGIN_ID,"Probleme beim Login:"+e.getMessage(),e));
				//logger.error("Fehler beim Login",e);
}
Es wird auf jedenfall eine RemoteException welche die LoginException beinhaltet geworfen und ich kanns mir nicht erklären.
 

SegFault

Bekanntes Mitglied
Warum es mit, von Remote Exceptions abgeleiteten Klassen nicht geht, weiß ich nicht. Ich leite nun nur von Exception ab. Damit hat sich das ganze. Trotz allem danke für die Hilfe.
 

tfa

Top Contributor
Wenn du sowieso Spring benutzt, wieso dann nicht auch Spring-Remoting? Dann sparst du dir die Exceptions komplett - selbst wenn du die RMI-Implementierung verwendest.
 

SegFault

Bekanntes Mitglied
weil mir gestern erst aufgefallen ist das es sowas gibt, ich versuchs gleich mal. Das ganze Projekt ist sowieso aktuelle meine Spielwiese um mir neue Sachen an zu eignen.
 

Neue Themen


Oben