Frage

Ich habe eine Unternehmensanwendung A und B eingesetzt (in WLS 10.0). A ist der "Rahmen", B ist eine Client-Anwendung. Die Client-Probleme der folgenden Anrufe:

Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2

ConnectionFactory- ist eine Schnittstelle, wie folgt definiert:

public interface ConnectionFactory 
    extends java.io.Serializable, javax.resource.Referenceable {
    ...
}

Was passiert ist:

  1. Wenn das Glas der Interface-Klasse ist auf dem System Classpath enthält, Zeile 2 ausgeführt fein
  2. Wenn die Interface-Klasse nicht auf dem System Classpath ist, aber mit den Anwendungen separat verpackt, Linie 2 wirft einen Classcast (die den informativen Text hat, dass das o ein ConnectionFactoryImpl ist)

Warum ist das möglich? Ich gehe davon aus, dass die JNDI-Suche gibt nur einen Stummel auf das entfernte Objekt (bin ich richtig in diesem Punkt?), Dann warum ist es wichtig, wenn die Klassenlader der Interface-Klasse unterschiedlich sind?

Die Art der Antwort, die ich erwarten:

  1. Ja, es sollte die Art und Weise passieren Sie es erleben, weil ...
  2. Nein, es sollte nicht auf diese Weise geschehen, denn wenn ... dann ..., so etwas faul es in Ihrem Setup ist
  3. Die Situation beschrieben Sie ist sehr seltsam, sind Sie sicher, dass Sie nicht irgendwann irgendwo verpassen?
  4. ...:)

Es wäre auch schön, wenn jemand klären kann, wie die JNDI und Stubs Arbeit, wo kommt das Casting geschehen (auf der Client-Seite auf dem Stummel? Oder auf dem ursprünglichen Objekt auf der Remote-Seite?), Etc.

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Die Antwort, leider ist (1).

JNDI diktiert keinen Mechanismus, wie das Objekt auf dem Baum gespeichert ist, oder wie es an Kunden ausgeliefert. Es ist nur eine API für die Durchführung der Operationen verwendet werden.

Wenn beide Anwendungen in der gleichen JVM sind, wie sie hier sind, dann ist Weblogic sehr wahrscheinlich Gabe nur das Objekt direkt an die Clientanwendung. Es gibt keine Stummel, und „Remote-Seite“. Da die von diesem Objekt implementiert Typen der Client-Anwendung nicht sichtbar sind (denken Sie daran, eine Art Identität durch die Klassennamen definiert ist, und auch die Klassenlader es geladen wurde aus).

Man könnte denken, das eine seltsame Sache ist, zu passieren, aber bedenken Sie, dass unter sich reden Anwendungen wie dies in JavaEE Entwicklung nicht die Norm ist - die Apps sollen voneinander getrennt werden, teilen nur Ressourcen auf Systemebene .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top