Java 自定义Spring作用域不适用于消息通道

Java 自定义Spring作用域不适用于消息通道,java,spring,message-queue,spring-integration,Java,Spring,Message Queue,Spring Integration,在SpringIntegration中,我试图创建一个具有自定义作用域的直接消息通道,如下所示 ... <int:channel id="myChannel" scope="validCustomScope" /> <int:service-activator ref="validSericeReference_WithSameValidCustomScope" method="handleMessage" input-channel="myChannel"/>

在SpringIntegration中,我试图创建一个具有自定义作用域的直接消息通道,如下所示

  ...
  <int:channel id="myChannel" scope="validCustomScope" />
  <int:service-activator ref="validSericeReference_WithSameValidCustomScope" method="handleMessage" input-channel="myChannel"/>
  ...
注意:此自定义范围适用于其他bean。
这个问题与所讨论的类似,但没有解决方案。如果有人能帮助解决这个问题,这将是一个巨大的帮助。

service activator将只订阅其中一个实例。其他人将抛出
Dispatcher没有订户

当service activator启动时,您的自定义作用域需要确定如何为每个实例传播订阅(service activator的
MessageHandler
),然后将其传播到启动端点后创建的任何新实例

可能不平凡

也就是说。我不清楚作用域通道向非作用域服务发送消息的好处


如果您解释一下如何使用自定义作用域,可能会有一个通用的解决方案,但我想它需要自定义作用域中一些棘手的代码。

这是一个很好的解释,解释了为什么会遇到“Dispatcher has no subscribers”异常。我们将在多租户环境中使用Spring集成,以便每个租户使用自己的通道和服务激活器。我们已经将相同的范围应用于ServiceActivatorbean定义。对此有何建议

<bean id="validSericeReference" class="ValidSericeClass" scope="validCustomScope"/> 


谢谢Gary--我们需要一个作用域通道,只向完全相同的作用域服务发送消息。有没有办法强迫它;创建一个单独的子上下文(带有通道、服务),并使用动态路由器路由到适当的通道。有关如何执行此操作的示例,请参见动态FTP示例。谢谢你的样品参考。服务激活器不能订阅相同作用域的通道吗?这将是一种比试图编写代码在运行时动态路由消息更自然的配置。但会导致相同的“Dispatcher没有通道订户”异常。不,该框架只是没有设置为在该级别理解作用域通道。当应用程序上下文启动使用者时,会发生通道订户连接。就其本质而言,作用域通道可以在上下文启动后来来去去去。文档中的
ThreadLocal
范围是一种特殊情况,仅适用于
QueueChannel
。在自定义范围中,您可以订阅一个新的处理程序。让您的处理程序实现
MessageHandler
并在您的自定义范围内声明它-从上下文中获取一个新的处理程序实例,并在创建新通道时订阅它。谢谢Gary--我们正在继续使用路由器选项。然而,是否有可能在Spring Integration中打开一张票证,以便在将来允许相同作用域的通道和服务@autowired,而不需要此路由器检测正确服务的开销?能够做到这一点有着巨大的优势。再次感谢。为每个租户(使用通道、服务)创建一个单独的子上下文,并使用动态路由器路由到适当的通道。有关如何执行此操作的示例,请参见动态FTP示例。如果您的
ValidServiceClass
实现了
MessageHandler
(可能是
AbstractReplyProducingMessageHandler
的子类),您可以在创建新频道时订阅一个新的频道,但您的作用域必须完成这项工作。在我的消息上下文中,有很多特定于租户的通道和服务处理程序,我必须为它们设置范围。在这种情况下,我应该为customer scope类中的每个通道订阅每个消息处理程序吗?我可以在XML配置中声明它们吗?对多租户环境中的可轮询通道有什么建议吗?谢谢。无论通道类型如何,您都需要动态运行时组件连接。框架采用静态连接,在上下文启动时建立;我能想到的使用标准组件的唯一解决方案是使用动态路由器,并将每个租户置于其自己的子配置中。
<bean id="validSericeReference" class="ValidSericeClass" scope="validCustomScope"/>