2013-05-13 3 views
5

Ich habe 2 Server-Instanzen von Jboss 5, von denen jeder mit zwei EARs bereitgestellt wird. Sagen Sie Client.Ear und Server.Ear. Server Ohr einige Ejb's freilegen. Ich möchte dies über Annotation in ClientEar einfügen. Mit JNDI Lookup habe ich es gut gemacht und es funktioniert. Aber mit Annotation bekomme ich immer javax.naming.NamingException. Beim Einfügen von Session-Beans über Deployment-Artefakte muss jedoch der globale JNDI-Name für die Injektion verwendet werden, und ich verwendete auch @EJB (mappedName = "java: global/Server/Komponente/ApplicationService! Com.test.server.ApplicationServiceInterface"))Remote-Lookup mit @ejb Annotation

Aber es scheint, als ob ich die provider_url des Remote-Servers nicht zur Verfügung stellen, um es an die Client-Ohr-Instanz zu binden. Wie kann ich jndi Eigenschaften, dh provider_url, initiale Kontexteigenschaften mit der Annotation @ EJB konfigurieren?

Antwort

1

@EJB Anmerkung kann nur verwendet werden, wenn die Anwendungen in derselben Serverinstanz bereitgestellt werden. @EJB Annotation wird nicht funktionieren, wenn Sie versuchen, Cross-Server-Instanz-Aufruf oder Remote-Server-Aufruf zu machen. In diesem Fall funktioniert die Annotationsinjektion nicht.

Also, was sind die Lösungen?

Option 1) alt Verwenden Stil JNDI programmatische

Option 2) erstellen Managed Bean per CDI (Context Dependency Injection) nachschlagen und konfigurieren Sie die alle JNDI Eigenschaften gibt. Und @inject die managed bean in Ihrem Client.

+0

Viele Anwendungsserver unterstützen die Verwendung der '@ EJB' Anmerkung entfernte Bohnen zum Ziel, darunter JBoss (per Rodrigos Antwort) und Glassfish. – DavidS

+0

Aber die Antwort von Rodrigo zeigt nicht an, wo die IP-Adresse des Servers, der das Remote-EJB bereitstellt, definiert wird. – Farah

+0

@Farah: Sie definieren die IP-Adresse des Servers über eine Eigenschaftendatei. Im Falle von Jboss platzieren Sie eine 'jboss-ejb-client.properties' in Ihrem Quellstammverzeichnis. Ein Beispiel finden Sie unter: https://github.com/akquinet/jbosscc-wildfly-examples/blob/master/ejb-remote-example/ejb-remote-example-ejb-client/src/main/resources/jboss- ejb-client.properties – gmazlami

5

fand ich einen Forenbeitrag, dass Ihre Frage beantwortet: https://community.jboss.org/thread/228789

Darin er

Und die JNDI-Suche mit dem @EJB annotaion zu erreichen, um https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+server+instance verweist er verwendet

@EJB(lookup = "ejb:earname/modulename/BeanClass!fully.qualified.RemoteInterface") 
private RemoteInterface bean; 
+0

Beachten Sie, dass die Remote-Host-, Port- und Benutzerinformationen über eine Eigenschaftendatei definiert werden müssen, damit dies funktioniert. Legen Sie eine Datei 'jboss-ejb-client.properties' unter Ihrem Root-Quellordner ab.Ein Beispiel für eine solche Datei finden Sie hier: https://github.com/akquinet/jbosscc-wildfly-examples/blob/master/ejb-remote-example/ejb-remote-example-ejb-client/src/main/resources /jboss-ejb-client.properties – gmazlami

1

Ich weiß das etwas zu spät. Einschließlich dieser zur weiteren

können Sie das tragbare String nachschlagen Format verwenden EJBs RMI verwenden über IIOP und hat EJB Standard-Mapping-Architektur CORBA So können Sie Nachschlag von Server-Host und Port-Nummer von

@EJB(lookup = "corbaname:iiop:example.com:3701#java:global/mycrud/mycrud-dss-ejb/InformeBean!com.myorg.ejb.InformeRemote") 

Referenzen: https://docs.oracle.com/javase/8/docs/technotes/guides/idl/corba.html https://docs.oracle.com/javase/8/docs/technotes/guides/idl/INStutorial.html

+0

Es klingt perfekt, aber wenn ich den Remote-Service aufrufen, bekomme ich keine Antwort und keinen Fehler jemals ... Die einzige Möglichkeit, die es funktionierte, war durch Nachschlagen mit Abstract Factory. –

+0

Mit dem Beispiel: 'Eigenschaften Requisiten = neue Eigenschaften(); props.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); props.setProperty ("org.omg.CORBA.ORBInitialHost", "server.com"); props.setProperty ("org.omg.CORBA.ORBInitialPort", "3700"); versuchen { InitialContext ctx = neue InitialContext (Requisiten); Rückgabe (RemoteService) ctx.lookup ("com.server.package.RemoteService"); } catch (NamingException e) { ...; } ' –