是否有可能明确规定在JBoss EAP 6中使用哪个EJB Receiver?

时间:2015-12-14 22:37:20

标签: jboss

我正在尝试从运行在JBoss EAP 6的单独实例上的客户端服务器上远程调用在一个JBoss EAP 6实例上运行的多个服务器。我已经配置了JBoss-to-JBoss远程通信,并已阅读关于scoped EJB客户端上下文,但这两者似乎不兼容。目前,我配置了两个EJB Receiver(每个远程服务器一个),但是当我尝试进行远程调用时,初始化的Context会随机选择它将使用的EJB Receiver。如果我有远程ip和端口,或者远程连接名称,我可以强制在初始化Context时使用哪个EJB Receiver似乎是合理的,但是,我不知道秘密握手。

host.xml

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

domain.xml中

<subsystem xmlns="urn:jboss:domain:remoting:1.2">
                <connector name="remoting-connector" socket binding="remoting" security-realm="ApplicationRealm"/>
                <outbound-connections>
                    <remote-outbound-connection name="remote-ejb-connection" outbound-socket-binding-ref="mpg1-app1" username="ejbuser" security-realm="ejb-security-realm">
                        <properties>
                            <property name="SASL_POLICY_NOANONYMOUS" value="false"/>
                            <property name="SSL_ENABLED" value="false"/>
                        </properties>
                    </remote-outbound-connection>
                    <remote-outbound-connection name="remote-ejb-connection2" outbound-socket-binding-ref="mpg2-app1" username="ejbuser" 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>
...
<socket-binding-group name="full-sockets" default-interface="public">
            ...
            <socket-binding name="remoting" port="44447"/>
            <outbound-socket-binding name="mpg1-app1">
                <remote-destination host="localhost" port="44452"/>
            </outbound-socket-binding>
            <outbound-socket-binding name="mpg2-app1">
                <remote-destination host="localhost" port="44453"/>
            </outbound-socket-binding>
</socket-binding-group>

的JBoss-EJB-client.xml的

<jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0">
    <client-context>
        <ejb-receivers>
            <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection"/>
            <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection2"/>
        </ejb-receivers>
    </client-context>
</jboss-ejb-client>

远程通话

  

上下文ctx = null;

     

final属性props = new Properties();

     

props.put(Context.URL_PKG_PREFIXES,“org.jboss.ejb.client.naming”);

     

尝试{

     

ctx = new InitialContext(props);
  MyInterfaceObject ourInterface = ctx.lookup(“ejb:”+ appName +“/”+ moduleName +“/”+ beanName +“!”   + viewClassName);

     

ourInteface.refreshProperties(); //远程方法调用

     

}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您是否尝试过cluster-node-selector

的JBoss-EJB-client.xml的                                                    

  <!-- if an outbound connection connect to a cluster a list of members is provided after successful connection.
To connect to this node this cluster element must be defined.
-->
   <clusters>
     <!-- cluster of remote-ejb-connection-1 -->
     <cluster name="ejb" security-realm="ejb-security-realm-1" username="test" cluster-node-selector="org.jboss.as.quickstarts.ejb.clients.selector.AllClusterNodeSelector">
        <connection-creation-options>
           <property name="org.xnio.Options.SSL_ENABLED" value="false" />
           <property name="org.xnio.Options.SASL_POLICY_NOANONYMOUS" value="false" />
        </connection-creation-options>
      </cluster>
   </clusters>
  </client-context>
</jboss-ejb-client>

选择器实施

    @Override
            public String selectNode(final String clusterName, final String[] connectedNodes, final String[] availableNodes) {
                    if (availableNodes.length == 1) {
                            return availableNodes[0];
                    }
                    // Go through all the nodes and point to the one you want
                    for (int i = 0; i < availableNodes.length; i++) {
                            if (availableNodes[i].contains("someoneYouInterestIn")) {
                                    return availableNodes[i];
                            }
                    }

                    final Random random = new Random();
                    final int randomSelection = random.nextInt(availableNodes.length);
                    return availableNodes[randomSelection];
            }

有关详细信息,请查看 https://access.redhat.com/documentation/en/red-hat-jboss-enterprise-application-platform/7.0/developing-ejb-applications/chapter-8-clustered-enterprise-javab