2015-05-11 3 views
1

Я бы хотел иметь два экземпляра Wildfly (или JBoss 7), где один из серверов разговаривает с EJB на другом сервере. Сложная часть заключается в том, что according to documentation, необходимо создать удаленные исходящие соединения с привязкой к исходящим сокетам. Это большая проблема для нашей команды Operations, особенно когда мы хотим уменьшить масштаб.Wildfly to Wildfly EJB-клиент без удаленных исходящих соединений

Есть ли способ, чтобы экземпляр Wildfly вызывал EJB на другой экземпляр Wildfly, программируя указание удаленного хоста?

Я смог заставить Tomcat 7 вызывать Wildfly EJB. Я добавил зависимость Maven от org.jboss.as:jboss-as-ejb-client-bom:7.5.0.Final-redhat-21 и установил настройки подключения в соответствии с this documentation.

Спасибо!

EDIT

Когда я пытаюсь тот же код, который работал в Tomcat 7 (который использует библиотеку JBoss-EJB-клиент), я получаю ошибку EJBCLIENT000021: EJB client context selector may not be changed, когда мой код пытается сделать EJBClientContext.setSelector(selector). Я устанавливаю хост и порт удаленного соединения программно вместо использования jboss-ejb-client.properties.

+0

Что произойдет, если вы используете тот же самый код в диком, а не в tomcat? –

+0

Знаете ли вы, что вы можете предоставить вашей команде Ops шестистрочный CLI-скрипт, который будет устанавливать для вас удаленные исходящие соединения? Это позволяет сохранить конфигурацию удаленного хоста полностью отдельно от вашего приложения. Просто что-то еще, чтобы рассмотреть ... –

+0

Код, который работал в Tomcat, создал «Селектор контекста клиента EJB, не может быть изменен» в Wildfly –

ответ

2

Ответ jgitter дал мне большую часть пути. Вот что я закончил с:

/** 
    * @return a reference to the EJB 
    * @throws EjbLookupException 
    */ 
    @NotNull 
    public T lookup() 
    throws EjbLookupException 
    { 
    String path = createJndiPath(); 
    Context initialContext = null; 
    try 
    { 
     initialContext = createInitialContext(); 

     //noinspection unchecked 
     final T ejb = (T)initialContext.lookup(path); 

     if(m_apiVersion != null) 
     { 
      ((RemoteAPI)ejb).validateClientCompatibility(m_apiVersion); 
     } 

     return ejb; 
    } 
    catch(NamingException | RuntimeException e) 
    { 
     throw new EjbLookupException("Unable to find the JBoss EJB at " + path, e); 
    } 
    finally 
    { 
     if(initialContext != null) 
     { 
      //noinspection ThrowableResultOfMethodCallIgnored 
      Closer.close(initialContext); 
     } 
    } 
    } 

    /** 
    * There are a lot of ways to do JBoss 7/Wildfly EJB lookups. Using this method, we don't have to create 
    * outbound socket bindings whenever we want to use a remote EJB. 
    * 
    * @throws NamingException 
    */ 
    @NotNull 
    private Context createInitialContext() 
    throws NamingException 
    { 
    Properties properties = new Properties(); 

    properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
    properties.put("org.jboss.ejb.client.scoped.context", "true"); 
    properties.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); 
    properties.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false"); 
    properties.put("remote.connections", "default"); 

    properties.put("remote.connection.default.host", m_host); 
    properties.put("remote.connection.default.port", String.valueOf(m_port)); 

    if(m_username != null) 
    { 
     properties.put("remote.connection.default.username", m_username); 
    } 
    if(m_password != null) 
    { 
     properties.put("remote.connection.default.password", m_password); 
    } 

    return new InitialContext(properties); 
    } 

    public static class EjbLookupException 
    extends Exception 
    { 
    EjbLookupException (
     @NotNull String message, 
     @NotNull Throwable cause) 
    { 
     super(message, cause); 
    } 
    } 

Я не уверен, нужна ли мне scoped context, и я не могу закрывать соединение должным образом. Я обновлю этот ответ, исходя из того, что я узнаю.

1

Вам не нужно использовать удаленное исходящее соединение. Вы можете просто написать код так, как если бы вы были внешним клиентом. См.: https://docs.jboss.org/author/display/WFLY9/EJB+invocations+from+a+remote+client+using+JNDI.

+0

Было бы здорово. В этом случае исходный текст должен быть закрыт после завершения вызовов EJB? И есть ли смысл указывать имя хоста программным путем вместо использования jboss-ejb-client.properties? –

+0

Есть несколько образцов, если вы google вокруг. Однако ваш вопрос о закрытии контекста является хорошим. На самом деле существует второй контекст (ejb: контекст, используемый под капотом). Здесь есть хорошая информация: https://docs.jboss.org/author/display/AS72/Scoped+EJB+client+contexts. – jgitter

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