Spring integration 部署在2节点群集上时,已分区的步骤仍处于启动状态

Spring integration 部署在2节点群集上时,已分区的步骤仍处于启动状态,spring-integration,spring-batch,Spring Integration,Spring Batch,我有一个QueueChannel,它是聚合器的输出通道。该代码在单节点集群上运行良好。现在,我将它部署在2节点集群上,partitionStep还没有完成,并且永远保持在STARTED状态。查看PartitionStep,它似乎正在接收方法中等待,并且从未标记该步骤已完成。下面是我正在使用的配置 <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> <property nam

我有一个QueueChannel,它是聚合器的输出通道。该代码在单节点集群上运行良好。现在,我将它部署在2节点集群上,partitionStep还没有完成,并且永远保持在STARTED状态。查看PartitionStep,它似乎正在接收方法中等待,并且从未标记该步骤已完成。下面是我正在使用的配置

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                <prop key="java.naming.provider.url">${oag_wl_nodes_url}</prop>
            </props>
        </property>
    </bean>

    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplate" />
        <property name="jndiName" value="jmsConnectionFactory" />
    </bean>

    <int:channel id="requestsChannel" />

    <bean id="reqQueue" class="org.springframework.jndi.JndiObjectFactoryBean"
        lazy-init="true" scope="prototype">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>masterRequestQueue</value>
        </property>
    </bean>

    <int-jms:outbound-channel-adapter
        connection-factory="connectionFactory" channel="requestsChannel" destination="reqQueue" />

    <int:channel id="replyChannel" />

    <bean id="replyQueue" class="org.springframework.jndi.JndiObjectFactoryBean"
        lazy-init="true" scope="prototype">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>masterReplyQueue</value>
        </property>
    </bean>

    <int-jms:message-driven-channel-adapter connection-factory="connectionFactory" destination="replyQueue" 
            channel="replyChannel" acknowledge="transacted" />

    <int:channel id="aggregatedReplyChannel">
        <int:queue />
    </int:channel>

    <int:aggregator ref="partitionHandler" 
            input-channel="replyChannel" output-channel="aggregatedReplyChannel" />

weblogic.jndi.WLInitialContextFactory
${oag\U wl\U节点\U url}
主请求队列
主应答队列

您正在使用一个公共回复队列
replyQueue
;这将不起作用,因为这两个实例正在竞争应答,并且应答可能被非主节点使用

您需要为每个邮件指定一个单独的回复目的地

也就是说,我没有看到您在出站消息上设置replyTo,因此我假设您的replyTo在消费者端是硬编码的


您可能会发现使用出站网关比使用一对通道适配器更容易;网关将为每个请求创建一个临时回复队列(默认情况下)。

您好,谢谢您的回复。因为我们使用的是公共回复队列。聚合器可以从该回复队列中读取消息,并将消息放入队列通道中。上面的聚合器配置说明输入通道是replychannel,输出通道是aggregatedReplyChannel,它是一个队列通道。我们不能使用消息驱动的通道适配器,这样它就不会从replyqueue中消耗任何信息,聚合器会从主节点上的应答队列中消耗消息,并将它们放入输出通道,即aggregatedReplyChannel。这里有一些背景。。。,本例中的作业是从一个端点调用的,该端点将从一个可以被视为主节点的节点触发。我们假设主配置只应从该节点加载。我们的假设正确吗?主配置是否也会从其他节点触发?我们的从属配置是一个单独的配置文件,在服务器启动时使用spring侦听器加载,这样两个集群节点都将侦听我们的请求队列。我说,因为所有节点都作为对等节点是很常见的,并且在运行时选择一个节点来启动作业。在这种情况下,您需要一个专用的回复通道。如果回复队列中只有一个主机,因此只有一个使用者,那么这应该不是问题。频道类型不重要。我建议您打开调试日志,并在主服务器和从服务器上跟踪消息。再次感谢。还有一件事。SI框架配置是否有规定,使聚合器仅在配置的主节点上处于活动状态。目前,我们正在使用spring应用程序上下文从端点中加载主配置。有更好的方法来实现这一点吗?您可以在消息驱动通道适配器上设置
auto startup=“false”
,并且只在主节点上启动它。