没有远程出站连接的 Wildfly 到 Wildfly EJB 客户端
Wildfly to Wildfly EJB client without remote-outbound-connections
我希望能够有两个 Wildfly(或 JBoss 7)实例,其中一个服务器与另一个服务器上的 EJB 对话。棘手的部分是 according to documentation,需要创建带有出站套接字绑定的远程出站连接。这对我们的运营团队来说是一个很大的麻烦,尤其是当我们想要横向扩展时。
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-client 库)中工作的相同代码时,当我的代码尝试做 EJBClientContext.setSelector( selector )
。我正在以编程方式设置远程连接主机和端口,而不是使用 jboss-ejb-client.properties.
您不必使用远程出站连接。您可以像任何外部客户一样编写代码。参见:https://docs.jboss.org/author/display/WFLY9/EJB+invocations+from+a+remote+client+using+JNDI.
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,我可能没有正确关闭连接。我会根据我的发现更新这个答案。
我希望能够有两个 Wildfly(或 JBoss 7)实例,其中一个服务器与另一个服务器上的 EJB 对话。棘手的部分是 according to documentation,需要创建带有出站套接字绑定的远程出站连接。这对我们的运营团队来说是一个很大的麻烦,尤其是当我们想要横向扩展时。
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-client 库)中工作的相同代码时,当我的代码尝试做 EJBClientContext.setSelector( selector )
。我正在以编程方式设置远程连接主机和端口,而不是使用 jboss-ejb-client.properties.
您不必使用远程出站连接。您可以像任何外部客户一样编写代码。参见:https://docs.jboss.org/author/display/WFLY9/EJB+invocations+from+a+remote+client+using+JNDI.
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,我可能没有正确关闭连接。我会根据我的发现更新这个答案。