Hallo zusammen,
ich arbeite mich gerade in EJB3 ein und es tauchen gelegentlich Fragen auf, die ich mir derzeit noch nicht beantworten kann.
Folgendes Szenario:
Ich habe eine Enterprise Application mit EJB3 auf einem JBoss AS 6 laufen. Parallel dazu läuft die gleiche Enterprise Application mit EJB3 auf einem entfernten Rechner, ebenfalls unter JBoss AS6. Ich möchte nun mit meinem Client, der remote auf noch einer anderen Maschine läuft, die EJBs benutzen, was soweit auch erstmal klappt. Auf den Remote Client bekomme ich zu den EJBs die passenden Proxy-Objekte mittels JNDI-Lookup. Die JNDI Properties liegen in der jndi.properties-Datei im src-Folder. Dort gibt es das Attribut:
Angenommen ich habe eine wie oben beschriebene verteilte Anwendung und möchte sowohl von Server1 als auch von Server2 Beans in meinem Remote Client benutzen. Und obendrein weiß ich nicht welche Bean auf welchem der beiden Server zu finden ist.
Ich habe folgendes versucht:
Das funktioniert auch. Wird die Bean bei Server 1 nicht gefunden, wird bei Server 2 angefragt.
Erstens die Frage, hab ich da das Rad neu erfunden und bringt EJB so etwas schon mit (habe nichts gefunden, daher dieser Versuch)?
Zweitens: folgendes Szenario: Server1 und Server2 beherbergen beide jeweils eine EJB die sich gegenseitig benutzen sollen. Das klappt mittels DependencyInjection. Ich annotiere auf Server1 wie folgt:
auf Server2 wie folgt:
In den JNDI-Properties habe ich als java.naming.provider.url jeweils die Adresse des anderen Servers angegeben. Klappt auch alles, aber was mache ich denn, wenn ich nicht weiß auf welchem der beiden Server die gesuchte Bean bereitgestellt wird? Ich würde gerne annotieren wie oben beschrieben, und der Interceptor soll dann rausfinden woher er die Bean bekommt, ähnlich des JNDI-Lookup, den ich oben beschrieb...
Weiß jemand Rat?
ich arbeite mich gerade in EJB3 ein und es tauchen gelegentlich Fragen auf, die ich mir derzeit noch nicht beantworten kann.
Folgendes Szenario:
Ich habe eine Enterprise Application mit EJB3 auf einem JBoss AS 6 laufen. Parallel dazu läuft die gleiche Enterprise Application mit EJB3 auf einem entfernten Rechner, ebenfalls unter JBoss AS6. Ich möchte nun mit meinem Client, der remote auf noch einer anderen Maschine läuft, die EJBs benutzen, was soweit auch erstmal klappt. Auf den Remote Client bekomme ich zu den EJBs die passenden Proxy-Objekte mittels JNDI-Lookup. Die JNDI Properties liegen in der jndi.properties-Datei im src-Folder. Dort gibt es das Attribut:
Java:
java.naming.provider.url=jnp://localhost:1099
Ich habe folgendes versucht:
Java:
// jndi.properties
java.naming.provider.url=jnp://server1:1099,jnp://server2:1099
Java:
public Object getBeanByJNDILookup(String jndiName) {
Object result = null; // any bean fits into an Object (cast in receiving method required)
try {
String properties = (String) this.getContext().getEnvironment().get("java.naming.provider.url");
String[] namingURLs = properties.split(",");
for (int i=0; i<namingURLs.length; i++) {
try {
this.getContext().addToEnvironment("java.naming.provider.url", namingURLs[i]);
result = this.getContext().lookup(jndiName);
i = namingURLs.length;
} catch (NamingException e) {
System.err.println(this.getClass().getSimpleName() + " says: " + e.getMessage() + " (Host: " + namingURLs[i] + ")");
this.setContext(null);
}
}
} catch (NamingException e1) {
System.err.println(this.getClass().getSimpleName() + " says: " + e1.getMessage());
}
// make sure that the original context is loaded next time
this.setContext(null);
return result;
}
Erstens die Frage, hab ich da das Rad neu erfunden und bringt EJB so etwas schon mit (habe nichts gefunden, daher dieser Versuch)?
Zweitens: folgendes Szenario: Server1 und Server2 beherbergen beide jeweils eine EJB die sich gegenseitig benutzen sollen. Das klappt mittels DependencyInjection. Ich annotiere auf Server1 wie folgt:
Java:
@EJB
private MyBeanRemote myBeanFromServer2;
Java:
@EJB
private MyBeanRemote myBeanFromServer1;
Weiß jemand Rat?