EJB3 - Instanz von Remote Stateful Bean an Client zurückgeben?

sepan

Grünschnabel
Hallo,

ich habe folgende Frage.
Ich habe ein Stateful Session Bean (Parent), welches beim Aufruf einer Methode z.B. createChild() auf dem Server eine Instanz eines weiteren Stateful Session Beans erzeugt (Child). Diese Instanz soll dem Client zurückgegeben werden, damit dieser die Methoden direkt auf dem Child-Objekt aufrufen kann.
D.h. die Instanzierung des Child-Objects erfolgt nicht vom Client, sondern am Server, der Client soll jedoch das Objekt nutzen können.

So stell ich mir das vor:

Code:
@Remote
public interface Parent {
  void setTitle(String title);
  Child createChild(String name);
  void deleteChild(Child child);
}

@Remote
public interface Child {
  void setName(String name);
  void setAge(int age);
  // usw.
}

@Stateful
public class ParentImpl implements Parent, Serializable {
  private String title;
  private List<Child> children = new ArrayList<Child>();

  public void setTitle(String title) {
    this.title=title;
  }

  public Child createChild(String name) {
    Child c = new ChildImpl();
    c.setName(name);
    children.add(c);
    return c;
  }
  
  public void deleteChild(Child c) {
    children.remove(c);
  }
}

@Stateful
public class ChildImpl implements Child, Serializable {
  private String name;
  private int age;

  public void setName(String name) {
    this.name=name;
  }

  public void setAge(int age) {
    this.age=age;
  }
}


Am Client:
Code:
Hashtable props = new Hashtable();
props.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099");
try {
  InitialContext ctx = new InitialContext(props);
  Parent p = (Parent)ctx.lookup("Parent/remote");
  p.setTitle("...");
  Child c = p.createChild("Child 1"); // <- hier
  c.setAge(11);
  ...
} catch (Exception ex) {
  ex.printStackTrace();
}

Kann sowas überhaupt funktionieren?
 
Also dein Grundgedanke ist auf jeden Fall realisierbar aber dei Code ist unvollstandig.
 
Zuletzt bearbeitet von einem Moderator:
Also dei Grundgedanke ist auf jeden Fall realisierbar aber dei Code ist unvollstandig.

Kannst Du mir sagen, was fehlt?
Ich nehme an, die Klasse Child braucht zusätzlich ein lokales Interface, oder?
Code:
@Local
public interface ChildLocal {
  void setName(String name);
  void setAge(int age);
}
@Remote
public interface ChildRemote {
  void setName(String name);
  void setAge(int age);
}
@Stateful
public class ChildImpl implements ChildLocal, ChildRemote, Serializable {
  ....
}
wie würde das serverseitig aussehen? So?
Code:
@Stateful
public class ParentImpl implements Parent, Serializable {
  private List<ChildLocal> children = new ArrayList<ChildLocal>();
  ....  
  public ChildRemote createChild(String name) {
     ChildImpl c = new ChildImpl();
     c.setName(name);
     children.add((ChildLocal)c);
     return (ChildRemote)c;
  }
  ....
}
 
Willst du das Child Objekt zum Client übertragen und auf dem Client ausführen oder willst du es nur vom Client aus nutzen und auf dem Server ausführen?
 
Ich will es vom Client aus nutzen, ausgeführt soll es aber am Server werden. Also gleich wie bei Parent (remote), jedoch ohne dass die Instanzierung lokal am Client statt findet.
 
Meiner Meinung nach geht das definitiv nicht, was du da machst. Technisch vielleicht, allerdings verstößt du mit deiner Modellierung hochgradig gegen Architekturkonzepte.

Erstens sind SessionBeans eigentlich Implementierungen des Facade Patterns ergo KEINE Domänenobjekte die man mal eben per Serialisierung über die Leitung jagt. Zweitens unterliegt die Instanzverwaltung von SessionBeans dem Container. Sonst hebelst du das komplette Objektpooling aus.

Das Problem liegt meiner Meinung nach daran, dass du Entites als SessionBeans modellierst. Das ist halt von Grundauf falsch ;). Beispiel: Du hast eine Kundenverwaltung. Dabei würdest du dann eine SessionBean CustomerManager implementieren, die mit EntityBeans Customer, Adress etc. Arbeitet. Wass du jetzt an den Client schicken solltest / kannst sind die Instanzen der EntityBeans, nie aber jedoch die Serverkomponente (CustomerManager in dem Fall). Das macht definitiv keinen Sinn, da diese Komponente meist Referenzen auf andere Komponenten enthält (EntityManager usw.) Wie willst du die denn bitte serialisieren? ;)

Scheint, als hättest du das Konzept noch nicht so richtig verinnerlicht. ;)

Gruß
Ollie
 

Neue Beiträge

Zurück