Java 是否可以使用Wildfly 10为JMS网桥配置到JMS集群的故障切换?

Java 是否可以使用Wildfly 10为JMS网桥配置到JMS集群的故障切换?,java,jakarta-ee,wildfly,wildfly-10,Java,Jakarta Ee,Wildfly,Wildfly 10,我有两个JMS服务器,它们作为独立的完整ha环境中的JMS集群链接在一起。这些服务器承载着我的JMS目的地(让我们称它们为JMS主服务器) 此外,还有一个配置为独立完整服务器的服务器(让我们将其命名为JMS Slave)。此服务器具有到JMS主题的JMS桥 对于此配置,我在JMS从属服务器上创建了两个到远程服务器的套接字绑定: <outbound-socket-binding name="remote-server-1"> <remote-destination hos

我有两个JMS服务器,它们作为独立的完整ha环境中的JMS集群链接在一起。这些服务器承载着我的JMS目的地(让我们称它们为JMS主服务器)

此外,还有一个配置为独立完整服务器的服务器(让我们将其命名为JMS Slave)。此服务器具有到JMS主题的JMS桥

对于此配置,我在JMS从属服务器上创建了两个到远程服务器的套接字绑定:

<outbound-socket-binding name="remote-server-1">
    <remote-destination host="a.b.c.d" port="8080"/>
</outbound-socket-binding>
<outbound-socket-binding name="remote-server-2">
    <remote-destination host="a.b.c.d" port="18080"/>
</outbound-socket-binding>

我在消息传递子系统配置的两个http连接器上使用它们:

<http-connector name="remote-1-http-connector" socket-binding="remote-server-1" endpoint="http-acceptor"/>
<http-connector name="remote-2-http-connector" socket-binding="remote-server-2" endpoint="http-acceptor"/>

我创建了一个池连接工厂:

<pooled-connection-factory name="remote-connection" entries="java:/jms/remoteCF" connectors="remote-1-http-connector remote-2-http-connector" user="testuser" password="testpassword" failover-on-initial-connection="true"/>

最后,我配置JMS桥:

<jms-bridge name="HelloWorldQueue-jms-bridge" quality-of-service="DUPLICATES_OK" failure-retry-interval="5000" max-retries="-1" max-batch-size="10" max-batch-time="100">
    <source connection-factory="ConnectionFactory" destination="queue/HelloWorldQueue"/>
    <target connection-factory="jms/RemoteConnectionFactory" destination="queue/HelloWorldQueue" user="heinz" password="becker" >
        <target-context>
            <property name="java.naming.factory.initial" value="org.jboss.naming.remote.client.InitialContextFactory"/>
            <property name="java.naming.provider.url" value="http-remoting://a.b.c.d:8080, http-remoting://a.b.c.d:18080"/>
        </target-context>
    </target>
</jms-bridge>

结果是:

  • 如果两个JMS主服务器都已启动,并且我启动了JMS从服务器, 一切正常
  • 如果其中一个JMS主服务器关闭,我启动JMS从服务器,它 同样有效。jms网桥连接到可用节点
  • 但是如果我关闭JMS从机的JMS桥所连接的节点 如果已连接,则没有故障转移
我正在寻找一种配置,在这种配置中,JMS网桥在崩溃后“重新连接”到可用节点,而不让它进入与JMS主节点相同的集群


我怎样才能做到这一点?有没有其他可能得到类似的行为?还是有一个完全不同的设置方案?

我想我自己也找到了两种可能的解决方案。但它们都有一些缺点

第一个是使用JMS核心网桥。见:

不要将核心网桥与JMS网桥混淆。使用了核心桥 桥接任意两个JBoss EAP消息传递实例并使用核心API。 JMS桥接器可用于桥接任何两个符合JMS 1.1的JMS 提供程序并使用JMS API。最好使用芯桥 尽可能使用JMS桥

核心网桥或多或少会进行开箱即用的故障转移。已经有了一个连接器,它将自动执行故障切换。它在第一次连接期间检索群集拓扑,并在其生存期内使用它。为了能够在JMS主机停机时启动网桥,我们可以添加其他连接器:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
    <server name="default">
        ....
        <bridge name="my-core-bridge" static-connectors="remote-1-http-connector remote-2-http-connector" queue-name="jms.queue.HelloWorldQueue" user="username" password="pwd"/>
    </server>
    ...
 </subsystem>

....
...
核心网桥的缺点似乎是它不支持现成的JMS主题。似乎只有JMS队列在没有开销的情况下工作

但也可以配置一个JMS网桥,以便重新连接到另一台服务器。为了建立连接,JMS网桥在由属性“java.naming.provider.url”配置的一个服务器上进行JNDI查找。此查找仅在启动期间执行,一旦完成,它将使用检索到的远程连接工厂(此处称为RemoteConnectionFactory)进行连接和重新连接。但它使用的是JMS主机的RemoteConnectionFactory!因此有必要 在此处配置此连接工厂:

<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="master-1-http-connector master-2-http-connector" ha="true" block-on-acknowledge="true" reconnect-attempts="-1"/>

如果此RemoteConnectionFactory有一个到每个JMS主机的连接器,JMS网桥将检索所有必要的信息,以便在必要时重新连接到另一台服务器。我的问题的桥接配置现在可以正常工作,无需修改:

<jms-bridge name="HelloWorldQueue-jms-bridge" quality-of-service="DUPLICATES_OK" failure-retry-interval="5000" max-retries="-1" max-batch-size="10" max-batch-time="100">
    <source connection-factory="ConnectionFactory" destination="queue/HelloWorldQueue"/>
    <target connection-factory="jms/RemoteConnectionFactory" destination="queue/HelloWorldQueue" user="username" password="pwd" >
        <target-context>
            <property name="java.naming.factory.initial" value="org.jboss.naming.remote.client.InitialContextFactory"/>
            <property name="java.naming.provider.url" value="http-remoting://a.b.c.d:8080, http-remoting://a.b.c.d:18080"/>
        </target-context>
    </target>
</jms-bridge>


我的“jms网桥配置”的缺点是它的复杂性。

虽然只是稍微相关,但当我测试供应商jms客户端与HA域中4个服务器节点的连接时,拓扑何时会发生更改发送了拓扑更改更新,如果我回忆正确,然后JMS客户机将切换到另一个节点。我知道这帮不了什么忙。我想知道您是否可以打开一些调试并查看哪些没有发生。链接到Stefan的详细(且有用)示例: