Jboss 没有远程出站连接的Wildfly到Wildfly EJB客户端

Jboss 没有远程出站连接的Wildfly到Wildfly EJB客户端,jboss,jboss7.x,wildfly,wildfly-8,Jboss,Jboss7.x,Wildfly,Wildfly 8,我希望能够有两个Wildfly(或JBoss7)实例,其中一个服务器与另一个服务器上的EJB对话。棘手的部分是,需要创建带有出站套接字绑定的远程出站连接。这对我们的运营团队来说是个大麻烦,尤其是当我们想要扩大规模时 Wildfly实例是否可以通过编程方式指定远程主机来调用另一个Wildfly实例上的EJB 我已经能够让Tomcat7调用Wildfly EJB。我在org.jboss.as:jboss-as-ejb客户机bom:7.5.0.Final-redhat-21上添加了一个Maven依赖项

我希望能够有两个Wildfly(或JBoss7)实例,其中一个服务器与另一个服务器上的EJB对话。棘手的部分是,需要创建带有出站套接字绑定的远程出站连接。这对我们的运营团队来说是个大麻烦,尤其是当我们想要扩大规模时

Wildfly实例是否可以通过编程方式指定远程主机来调用另一个Wildfly实例上的EJB

我已经能够让Tomcat7调用Wildfly EJB。我在org.jboss.as:jboss-as-ejb客户机bom:7.5.0.Final-redhat-21上添加了一个Maven依赖项,并根据设置了连接设置

谢谢

编辑


当我尝试在Tomcat 7(使用jboss ejb客户端库)中工作的相同代码时,我得到错误
ejbclient00021:ejb客户端上下文选择器在我的代码尝试执行
EJBClientContext.setSelector(选择器)
时可能不会更改。我以编程方式设置远程连接主机和端口,而不是使用jboss ejb client.properties。

您不必使用远程出站连接。您可以像编写任何外部客户机一样编写代码。请看:。

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

我不确定是否需要连接,并且可能没有正确关闭连接。我将根据我发现的情况更新此答案。

如果您在Wide而不是tomcat中使用相同的代码,会发生什么?您是否知道您可以为您的Ops团队提供一个六行CLI脚本,用于为您设置远程出站连接?这样做的好处是将远程主机配置与应用程序完全分开。在WildflyThanks Steve中,在Tomcat中产生的代码“EJB客户端上下文选择器可能不会改变”。不过我们有这么多服务器,在我们的例子中,能够以编程方式设置远程主机会很有帮助。那太好了。在这种情况下,需要在EJB调用完成后关闭InitialContext吗?有没有一个以编程方式设置主机名而不是使用jbossejb client.properties的示例?如果你在谷歌上搜索一下,这里有一些示例。不过,你关于结束上下文的问题是个好问题。实际上还有第二个上下文(ejb:引擎盖下使用的上下文)。这里有一些很好的信息:。