2015-02-19 19 views
5

mój obecny problem w ogólności jest to, że mam dwie instancje 8.2.0Final Wildfly działa na moim komputerze. Wiem, są podobne pytania, ale żaden z nich naprawdę nie pomaga w moim problemie. Jeden z nich zawiera spokojną aplikację, która wyzwala bezpaństwowy komponent bean sesji SenderBean po otrzymaniu GET. Następnie ten bezstanowy komponent bean sesji powinien wywoływać metodę ze zdalnego bezstanowego komponentu bean sesji PrintBean, który znajduje się w innej instancji klasy Wildfly.EJB na Wildfly wywołanie zdalnego EJB z innego Wildfly

Zacznę od wyjaśnienia, co zrobiłem do tej pory (może coś przeoczyłem, jestem całkiem nowy w Java EE i Wildfly).

Idę zadzwonić do JBoss Application Server wystąpienie z SenderBeanSender i jedną z PrintBeanReceiver.

Utworzono użytkownika aplikacji o nazwie Stefan z hasłem stefan należącym do grupy guest na urządzeniu Receiver. Na Sender w standalone-full.xml dodałem Security-Realm umieszczając

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

do sekcji <security-realms>. również dodano wychodzące gniazdo wiążące umieszczając

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

do sekcji <socket-binding-group ...>. Ostatnio stworzyłem-wychodzącego połączenia, umieszczając

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

do sekcji <subsystem xmlns="urn:jboss:domain:remoting:2.0">.

Uruchamiam Sender za pomocą komendy CLI standalone.bat -c standalone-full.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=Sender i Receiver z standalone.bat -c standalone-full.xml -Djboss.node.name=Receiver.

Lokalny Stateless Session Bean na Sender nazywa 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(); 
    } 
    } 
} 

A Receiver zawiera PrintBean:

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

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

Problem jest teraz, zawsze uzyskać IllegalStateException który mówi EJBCLIENT000025 : Brak odbiornika EJB do obsługi ...

Czy jestem może robiąc coś bardzo nie tak? Jestem całkiem nowy w EJB i Wildfly. Możesz znaleźć konfigurację projektu na GitHub.

Odpowiedz

1

Powinieneś dodać plik jboss-ejb-client.xml do swojego EAR-a (nie do WAR). Umieść go obok pliku application.xml.

zawartość 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> 

W nadawcy fasoli dwie linie są wystarczająco:

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

Należy zauważyć, że usunięto odbiornik "/" z drogi. W dzienniku serwera można znaleźć powiązania JNDI.

0

W moim umyśle problem znajduje się w parametrach InitialContext, konfiguracja serwera jest dobra. Starają się podążać za moim przykładem połączenia do zdalnej kolejki, w przypadku zwykłych ziaren korporacyjnych można zbadać taki scenariusz zbyt (wstawić poprawną logowanie użytkownika i hasło):

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

Pamiętaj, że JNDI zasobów z otwartą możliwością dostępu z zewnątrz musi zaczynać się od konfiguracji serwera za pomocą java:/jboss/exported /, ale po stronie klienta możesz upuścić te słowa. Ta instrukcja jest dobra dla WildFly, ale nie dla JBoss EAP/AS i innych.Więcej informacji można uzyskać, postępując zgodnie z link.