RMI Verschiedene Unterobjekte trotz selbem Remote Object

  • Themenstarter Themenstarter WillymF
  • Beginndatum Beginndatum
W

WillymF

Gast
Hallo,

ich habe frage ein Remote Object ab, das seinerseits einige Objekte (z.B. eine Liste mit den Kategorien eines Auktionshauses) gespeichert hat. Wenn ich dieses Objekt nun mit 2 "verschiedenen" Iterationen abfrage, dann kommt anscheinend das selbe Objekt zurück:

Java:
AuctionHousClient client = new AuctionHousClient();
AuctionHousClient client_test = new AuctionHousClient();
System.out.println("Vergleiche CategoryStack:");
System.out.println(client.categories.toString());
System.out.println(client_test.categories.toString());

gibt das hier aus:

Proxy[CategoryStack,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[192.168.1.3:4958](remote),objID:[48cdd2c2:1291ce59ccb:-7fff, 6115791102948140633]]]]]
Proxy[CategoryStack,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[192.168.1.3:4958](remote),objID:[48cdd2c2:1291ce59ccb:-7fff, 6115791102948140633]]]]]

Spreche ich nun aber ein "Unterobjekt" an, dann kommen andere Objekte zurück:
Java:
System.out.println("Vergleiche Category Werkzeuge:");
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client_test.categories.getCategory("Werkzeuge").toString());
gibt das hier aus:

Vergleiche Category Werkzeuge:
Category@1690726
Category@1f1fba0
Category@1befab0

Wie kann denn das sein? Objekte, die zu einem Remote Object gehören werden ja wohl mitserialisiert und können auch verändert werden, oder?

Danke
Willy
 
Der besseren Fehlerlokalisierungsmöglichkeit wegen schicke ich einmal den ganzen Code....

Ich starte zuerst AuctionServer und dann GuiTest

AuctionServer.java
[Java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;


public class AuctionServer {

public static void main(String[] args)
{
CategoryStack categoryStack = new CategoryStackImpl();

// Export AuctionsHousClient and bind to Registry
Registry reg = null;
try
{
reg = LocateRegistry.createRegistry(4321);
UnicastRemoteObject.exportObject(categoryStack, 0);
reg.bind("auctionhouse", categoryStack);
}catch(RemoteException e)
{
e.printStackTrace();
}
catch(AlreadyBoundException e)
{
e.printStackTrace();
}

// Add Articles to Category "Eins"
ArrayList<Article> articles = new ArrayList<Article>();


// HIER INITIALISIERE ICH EIN PAAR ARTICLES

System.out.println("Tryin to add Articles...");
Category addCategory = null;
try
{
addCategory = categoryStack.getCategory("Werkzeuge");
}
catch(RemoteException ex)
{
ex.printStackTrace();
}
for(Article a: articles)
{
addCategory.addArticle(a);
System.out.println("Articles added!");
}

System.out.println("Server up. Hit enter to exit.");
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));

try
{
if (stdIn.readLine() != null)
{
stdIn.close();

if(categoryStack != null)
{
UnicastRemoteObject.unexportObject(categoryStack, false);
categoryStack = null;
}
reg.unbind("auctionhouse");
}
}
catch(IOException ex)
{
System.err.println("Error Reading STDIN.");
}
catch(NotBoundException ex)
{
System.err.println("auctionhouse not bound.");
}

}
}
[/Java]
GuiTest.java
[Java]
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;


public class GuiTest
{
public static void main(String[] args)
{
AuctionHousClient client = new AuctionHousClient();
AuctionHousClient client_test = new AuctionHousClient();

client.user = new User("testuser");
client_test.user = new User("testuser2");

System.out.println("Vergleiche CategoryStack:");
System.out.println(client.categories.toString());
System.out.println(client_test.categories.toString());

try
{
System.out.println("Vergleiche Category Werkzeuge:");
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client_test.categories.getCategory("Werkzeuge").toString());
Category test = client.categories.getCategory("Werkzeuge");
test.addArticle(new Article());

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


// HIER INITIALISIERE ICH EIN PAAR ARTICLES

System.out.println("Tryin to add Articles...");
Category addCategory = null;
try
{
addCategory = client.categories.getCategory("Werkzeuge");
}
catch(RemoteException ex)
{
ex.printStackTrace();
}
for(Article a: articles)
{
addCategory.addArticle(a);
System.out.println("Articles added!");
}

System.out.println("Gebe alle Artikel aus...");
try
{
Category test = client_test.categories.getCategory("Werkzeuge");
test = addCategory;
for(Article a: test.getArticles())
{
System.out.println(a.getArticleName());
}
}catch(Exception e)
{
e.printStackTrace();
}

System.out.println("Alle Artikel ausgegeben.");

}
}
[/Java]
AuctionHousClient.java
[Java]
import java.awt.Button;
import java.awt.Font;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;

public class AuctionHousClient extends AuctionHousGUI
{
protected CategoryStack categories;
protected Category searched_category;
protected Article selected_article;
protected Category selected_category;
protected User user;

public AuctionHousClient()
{
try
{
// TODO: localhost, port hardcoded
Registry reg = LocateRegistry.getRegistry("localhost", 4321);
Object temp = reg.lookup("auctionhouse");
categories = (CategoryStack) temp;
}
catch(RemoteException e)
{
e.printStackTrace();
}
catch(NotBoundException e)
{
e.printStackTrace();
}
// Loginmaske anzeigen
generateLoginLayout();
setVisible(true); // GUI
}

public void windowClosing(WindowEvent e) // GUI
{
System.exit(0);
}
}
[/Java]

Wie gesagt, ist das Problem, dass der AuctionServer ein Objekt erstellt und exportiert. In diesem befinden sich auch die Testartikel, die ich initialisiert und eingefügt habe. Hole ich mir das Objekt "AuctionHousClient.categories" wird mir auch das selbe Objekt angezeigt. Hole ich mir aber von diesem Objekt wieder ein "Unterobjekt" durch "AuctionHousClient.categories.getCategorie("Werkzeug")", dann kommen immer unterschiedliche Objekte zurück. Diese beinhalten die Artikel, die ich am AuctionServer eingefügt habe. Aber die Artikel, die ich mit dem Client einfüge, sind verschwunden (meine Vermutung: Da ja jedes Mal ein neues Objekt geholt wird)....

Irgendwelche Ideen? Wäre sehr dankbar....

Danke
Willy
 
Solved the problem on my own.


It seems like you get and send local pointers, when you give an object to a Remot Object. Those are not found on the Remote Machine and therefor the object is null. All methods, which should be used from the remote machine, should be defined in the Remote Object with "simple" datatypes. Doesn't know, why i.e. String works though.....
 

Zurück
Oben