Domanda

Ho un'applicazione enterprise A e B schierato (in WLS 10.0). A è il "quadro", B è un applicazione client. Il client invia le seguenti chiamate:

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

ConnectionFactory è un'interfaccia, definito come:

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

Quello che succede è:

  1. Se il vaso contenente la classe interfaccia è sul classpath di sistema, la linea 2 viene eseguita bene
  2. Se la classe interfaccia non è sul classpath di sistema, ma confezionato con le applicazioni separatamente, linea 2 getta una ClassCastException (che ha il testo informativo che la o è un ConnectionFactoryImpl)

Perché questo è possibile? Presumo che la ricerca JNDI restituisce solo uno stub per l'oggetto remoto (ho ragione a questo punto?), Allora perché è importante se il programma di caricamento classe della classe di interfaccia sono diversi?

Il tipo di risposta che si aspettano:

  1. Sì, dovrebbe accadere il modo in cui si verificano, perché ...
  2. No, non dovrebbe accadere in questo modo, perché se ... allora ..., quindi c'è qualcosa di sospetto nella configurazione
  3. La situazione che hai descritto è molto strano, sei sicuro di non perdere un certo punto da qualche parte?
  4. ...:)

Inoltre, sarebbe bello se qualcuno potrebbe chiarire come il JNDI e mozziconi di lavoro, da dove viene il casting accade (sul lato client sul stub? O l'oggetto originale dal lato a distanza?), Ecc.

Grazie per il vostro aiuto!

È stato utile?

Soluzione

La risposta, purtroppo, è (1).

JNDI non impone un meccanismo di come l'oggetto viene memorizzato sul legno della croce, o il modo in cui viene consegnato ai clienti. E 'solo un'API da utilizzare per eseguire le operazioni.

Se entrambe le applicazioni sono nella stessa JVM, in quanto sono qui, poi Weblogic è molto probabile che solo consegnando l'oggetto direttamente all'applicazione client. Non v'è alcun stub, e "lato remoto". Dal momento che i tipi attuate da quell'oggetto non sono visibili per l'applicazione client (ricordate, un tipo di identità è definito dal nome della classe, e anche il programma di caricamento classe è stato caricato da).

Si potrebbe pensare che questa è una cosa strana per accadere, ma tenere a mente che le applicazioni a parlare tra di loro in questo modo non è la norma in fase di sviluppo JavaEE - le applicazioni dovrebbero essere isolati gli uni dagli altri, condividere solo le risorse a livello di sistema .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top