2015-05-11 121 views
1

我希望能夠有兩個Wildfly(或JBoss 7)實例,其中一個服務器與另一個服務器上的EJB進行通信。棘手的部分是according to documentation,需要創建帶出站套接字綁定的遠程出站連接。這對我們的運營團隊來說是一個很大的麻煩,尤其是當我們想要擴展時。Wildfly到沒有遠程出站連接的Wildfly EJB客戶端

有沒有辦法讓Wildfly實例通過編程指定遠程主機來調用另一個Wildfly實例上的EJB?

我已經能夠讓Tomcat 7調用Wildfly EJB。我在org.jboss.as:jboss-as-ejb-client-bom:7.5.0.Final-redhat-21上添加了一個Maven依賴關係,並根據this documentation設置了連接設置。

謝謝!

編輯

當我嘗試在Tomcat的7(其中使用了JBoss的EJB客戶端庫)的工作相同的代碼,我得到的錯誤EJBCLIENT000021: EJB client context selector may not be changed當我的代碼試圖做EJBClientContext.setSelector(selector)。我以編程方式設置遠程連接主機和端口,而不是使用jboss-ejb-client.properties。

+0

當你在wildly而不是tomcat中使用相同的代碼時會發生什麼? –

+0

您是否知道您可以爲您的Ops團隊提供一個六行CLI腳本,它將爲您設置遠程出站連接?這有利於將遠程主機配置與應用程序完全分開。只是別的可以考慮... –

+0

在蜻蜓工作的代碼生成的「EJB客戶端上下文選擇器可能不會改變」在蜻蜓 –

回答

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調用完成後需要關閉InitialContext?有沒有例程設置主機名而不是使用jboss-ejb-client.properties的例子? –

+0

如果你谷歌周圍有一些樣本。不過,關於關閉上下文的問題是一個很好的問題。實際上有第二個上下文(在引擎蓋下使用的ejb:上下文)。這裏有一些很好的信息:https://docs.jboss.org/author/display/AS72/Scoped+EJB+client+contexts。 – jgitter

相關問題