2015-02-19 6 views
5

Моя текущая проблема в целом заключается в том, что у меня есть два экземпляра Wildfly 8.2.0Final, запущенные на моей машине. Я знаю, есть похожие вопросы, но никто из них действительно не помогает с моей проблемой. Один из них содержит приложение, которое запускает сессионный компонент без состояния без учета состояния SenderBean, когда он получает GET. Впоследствии этот сеансовый компонент без состояния должен вызывать метод из удаленного сеанса сеанса без состояния PrintBean, который находится на другом экземпляре wildfly.EJB на Wildfly, вызывающем удаленный EJB от другого Wildfly

Начну с того, что объясню, что я сделал до сих пор (возможно, я что-то пропустил, я совсем не знаком с Java EE и Wildfly).

Я собираюсь вызвать Wildfly экземпляр с SenderBeanSender и один с PrintBeanReceiver.

Я создал пользователя приложения с именем Stefan с паролем stefan, принадлежащим группе guest на Receiver. На Sender в standalone-full.xml, я добавил Security-Realm, поставив

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

в раздел <security-realms>. Я также добавил исходящую-сокет-связывания, помещая

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

в секцию <socket-binding-group ...>. Наконец, я создал исходящую связь, поставив

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

в раздел <subsystem xmlns="urn:jboss:domain:remoting:2.0">.

Я начинаю Sender командой CLI standalone.bat -c standalone-full.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=Sender и Receiver с standalone.bat -c standalone-full.xml -Djboss.node.name=Receiver.

Сессия Bean Местные Stateless на Sender называется 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(); 
    } 
    } 
} 

И Receiver содержит PrintBean:

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

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

проблема сейчас, я всегда получаю IllegalStateException что говорит EJBCLIENT000025 : Нет приемника EJB для обработки ...

Am I возможно, что-то не так? Я довольно новичок в EJB и Wildfly. Вы можете найти проект на GitHub.

ответ

1

Вы должны добавить файл jboss-ejb-client.xml в свой код EAR (не для WAR). Поместите его рядом с application.xml.

содержание 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> 

В отправителе боба две линии достаточно:

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

Обратите внимание, что я удалил "приемник /" от пути. Вы можете найти привязки JNDI в журнале сервера.

0

На мой взгляд проблема находится в параметрах для InitialContext, конфигурация сервера хорошо. Попробуйте последовать моему примеру подключения к удаленной очереди, в случае обычных корпоративных компонентов вы можете изучить такой сценарий тоже (введите правильный логин и пароль):

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

помнить, что JNDI ресурсы с открытой внешней возможностью доступа должен начинаться с конфигурации сервера с помощью java:/jboss/exported /, но на стороне клиента вы можете вывести эти слова. Эта инструкция хороша для WildFly, но не для JBoss EAP/AS и других.Дополнительную информацию вы можете получить, следуя link.

Смежные вопросы