2015-02-19 4 views
5

mein aktuelles Problem im Allgemeinen ist, dass ich zwei Wildfly 8.2.0Final-Instanzen auf meinem Rechner ausgeführt habe. Ich weiß, es gibt ähnliche Fragen, aber keine von ihnen hilft wirklich bei meinem Problem. Einer von ihnen hält eine erholsame Anwendung, die eine statusfreie Session-Bean SenderBean auslöst, wenn es ein GET empfängt. Anschließend sollte diese statuslose Session-Bean eine Methode von einer fernen Stateless-Session-Bean PrintBean aufrufen, die sich auf der anderen Wildfly-Instanz befindet.EJB auf Wildfly Calling Remote EJB von einem anderen Wildfly

Ich werde damit beginnen zu erklären, was ich bisher gemacht habe (vielleicht habe ich etwas verpasst, ich bin ziemlich neu in Java EE und Wildfly).

Ich werde die Wildfly Instanz mit dem SenderBean die Sender und das mit dem PrintBean die Receiver nennen.

Ich habe eine Benutzeranmeldung Stefan mit Passwort namens stefan, das zur Gruppe guest auf den Receiver. Auf den Sender im standalone-full.xml, fügte ich einen Sicherheits-Realm von

<security-realm name="ejb-security-realm"> 
    <server-identities> 
    <secret value="c3R1ZmFu"/> 
    </server-identities> 
</security-realm> 

in den <security-realms> Abschnitt setzen. Ich habe auch eine Outbound-socket-Bindung durch

<outbound-socket-binding name="remote-ejb"> 
    <remote-destination host="localhost" port="8080"/> 
</outbound-socket-binding> 

in die <socket-binding-group ...> Abschnitt setzen. Schließlich habe ich eine Outbound-Verbindung, von

<outbound-connections> 
    <remote-outbound-connection name="remote-ejb-connection" outbound-socket-binding-ref="remote-ejb" username="Stefan" security-realm="ejb-security-realm"> 
    <properties> 
     <property name="SASL_POLICY_NOANONYMOUS" value="false"/> 
     <property name="SSL_ENABLED" value="false"/> 
    </properties> 
    </remote-outbound-connection> 
</outbound-connections> 

in den <subsystem xmlns="urn:jboss:domain:remoting:2.0"> Abschnitt setzen.

Ich starte die Sender mit dem CLI-Befehl standalone.bat -c standalone-full.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=Sender und die Receiver mit standalone.bat -c standalone-full.xml -Djboss.node.name=Receiver.

Die lokale Stateless Session Bean auf die SenderSenderBean genannt wird:

@Stateless 
public class SenderBean implements SenderService { 

    private static final Logger logger = Logger.getLogger(SenderBean.class.getSimpleName()); 

    public void send(){ 
    logger.info("Trying to invoke"); 
    this.invoke(); 
    } 

    private void invoke() { 
    Properties clientProperties = new Properties(); 
    clientProperties.put("remote.connections", "default"); 
    clientProperties.put("remote.connection.default.port", "8080"); 
    clientProperties.put("remote.connection.default.host", "localhost"); 

    Properties properties = new Properties(); 
    properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");   

    try { 
     Context context = new InitialContext(properties); 
     context = new InitialContext(properties); 
     Object x = context.lookup("ejb:baseproject-ear-01.00.00-SNAPSHOT/testdomain-service-01.00.00-SNAPSHOT/Receiver/PrintBean!com.schubert.baseproject.testdomain.service.PrintService"); 
     logger.info("Obtained some object "+x.toString()); 
     logger.info("Trying to cast."); 
     PrintService s = (PrintService) x; 
     logger.info("Cast successful"); 
     logger.info("Printing using remote ejb: "+s.print("Markus")); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Und die Receiver enthält die PrintBean:

@Stateless 
@Remote(PrintService.class) 
public class PrintBean implements PrintService { 

    @Override 
    public String print(String name) { 
    return "Hello " + name; 
    } 
} 

das Problem ist jetzt, ich immer ein IllegalStateException erhalten, die EJBCLIENT000025 sagt : Kein EJB-Empfänger zum Handhaben verfügbar ...

Bin ich vielleicht etwas falsch machen? Ich bin ziemlich neu bei EJBs und Wildfly. Sie finden das Projekt-Setup unter GitHub.

Antwort

1

Sie sollten die Datei jboss-ejb-client.xml zu Ihrer Sender-EAR hinzufügen (nicht zu WAR). Legen Sie es neben application.xml ab.

jboss-ejb-client.xml Inhalt:

<jboss-ejb-client> 
    <client-context> 
     <ejb-receivers> 
      <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection"/> 
     </ejb-receivers> 
    </client-context> 
</jboss-ejb-client> 

In Absender Bohne zwei Linien sind genug:

Context context = new InitialContext(); 
Object x = context.lookup("ejb:baseproject-ear-01.00.00-SNAPSHOT/testdomain-service-01.00.00-SNAPSHOT/PrintBean!com.schubert.baseproject.testdomain.service.PrintService"); 

Bitte beachte, dass ich "Receiver /" vom Weg entfernt. Sie können JNDI-Bindungen im Serverprotokoll finden.

0

In meinem Kopf befindet sich das Problem in den Parametern für InitialContext, Server-Konfiguration sind gut. Versuchen Sie, mein Beispiel der Verbindung mit der Remote-Warteschlange zu folgen, bei gewöhnlichen Enterprise-Beans Sie solches Szenario erkunden (einfügen korrekte Benutzername und Passwort):

env.put(Context.PROVIDER_URL, "http-remoting://localhost:8080"); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
    env.put(Context.SECURITY_PRINCIPAL, "client"); 
    env.put(Context.SECURITY_CREDENTIALS, "q"); 

    Context ctx = new InitialContext(env); 
    connectionFactory = (ConnectionFactory)ctx.lookup("/jms/RemoteConnectionFactory"); 
    connection = connectionFactory.createConnection("client", "q"); 

Denken Sie daran, dass jndi Ressourcen mit offener externer Zugriffsmöglichkeit muss bei Server config mit java:/jboss/exportierten/beginnen, aber auf der Client-Seite können Sie diese Wörter ablegen. Diese Anweisung ist gut für WildFly, aber nicht für JBoss EAP/AS und andere.Weitere Informationen erhalten Sie, indem Sie die link folgen.