2015-02-19 17 views
5

il mio problema corrente in generale è che ho due istanze di Wildfly 8.2.0 Finale in esecuzione sulla mia macchina. Lo so, ci sono domande simili, ma nessuna di queste aiuta veramente il mio problema. Uno di questi contiene un'applicazione riposante che attiva un bean di sessione stateless SenderBean quando riceve un GET. Successivamente, questo bean di sessione stateless dovrebbe richiamare un metodo da un bean di sessione stateless remoto PrintBean, che si trova nell'altra istanza di wildfly.EJB su Wildfly che chiama EJB remoto da un'altra Wildfly

Inizierò spiegando cosa ho fatto finora (forse mi sono perso qualcosa, sono abbastanza nuovo per Java EE e Wildfly).

Ho intenzione di chiamare l'istanza Wildfly con ilil Sender e quello con il PrintBean il Receiver.

Ho creato un utente dell'applicazione Stefan con password stefan, appartenente al gruppo guest su Receiver. Sul Sender, nel standalone-full.xml, ho aggiunto un Security-Realm mettendo

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

nella sezione <security-realms>. Ho anche aggiunto un outbound socket vincolante mettendo

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

nella sezione <socket-binding-group ...>. scorso, ho creato un uscita-collegamento, mettendo

<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> 

nella sezione <subsystem xmlns="urn:jboss:domain:remoting:2.0">.

Avvio il Sender con il comando CLI standalone.bat -c standalone-full.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=Sender e Receiver con standalone.bat -c standalone-full.xml -Djboss.node.name=Receiver.

Lo Stateless Local Session Bean sul Sender si chiama SenderBean:

@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(); 
    } 
    } 
} 

E il Receiver contiene il PrintBean:

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

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

Il problema ora è, ho sempre arrivare un IllegalStateException che dice EJBCLIENT000025 : Nessun ricevitore EJB disponibile per la gestione ...

Am I magari fare qualcosa di molto sbagliato? Sono abbastanza nuovo per EJB e Wildfly. È possibile trovare la configurazione del progetto su GitHub.

risposta

1

È necessario aggiungere il file jboss-ejb-client.xml al proprio EAR del mittente (non a WAR). Posizionalo accanto a application.xml.

contenuti jboss-ejb-client.xml:

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

In fagioli mittente due linee sono abbastanza:

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"); 

Si noti che ho rimosso "Receiver /" dal percorso. È possibile trovare i collegamenti JNDI nel registro del server.

0

Nella mia mente il problema si trova nei parametri di InitialContext, la configurazione del server è buona. Provate a seguire il mio esempio di connessione alla coda remota, in caso di bean enterprise ordinarie è possibile esplorare tale scenario troppo (inserire accesso corretti utente e password):

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"); 

ricordare che le risorse JNDI con Open possibilità accesso esterno deve iniziare alla configurazione del server con java:/jboss/exported /, ma sul lato client è possibile rilasciare queste parole. Questa istruzione è utile per WildFly, ma non per JBoss EAP/AS e altri.Ulteriori informazioni sono disponibili seguendo lo link.