如何在消息驱动的通道适配器上处理空目标

时间:2013-11-05 14:36:04

标签: spring-integration

我需要Spring Integration配置来处理应用程序将在其上接收消息的可变数量的队列的情况。

尝试了以下配置:

<int-jms:message-driven-channel-adapter id="dsToT2" 
    destination-name="#{tConfigurer.getDsToTQueues().values().toArray().length>2?
    dsConfigurer.getDsToTQueues().values().toArray()[2]:null}"
    connection-factory="connectionFactory"
    channel="ackToTChannel"/>

但是,如果destination-name解析为null,则抛出以下异常:

java.lang.IllegalArgumentException: 'destinationName' must not be null

处理此方案的最佳方法是什么? 感谢

1 个答案:

答案 0 :(得分:1)

因此,问题在于您在应用程序启动时获得IllegalArgumentException。 如果真的不知道你的排序是否为null,那么你应该做一些Java代码:

  1. 使用<int-jms:message-driven-channel-adapter>
  2. 标记您的auto-startup="false"
  3. 同时为DefaultMessageListenerContainer引入autoStartup=false的单独bean,并将其注入<int-jms:message-driven-channel-adapter>
  4. 至于destination-nameDefaultMessageListenerContainer的属性,您应该在应用程序启动时使用一些代码来解析目标,并将值(如果有的话)注入容器bean。
  5. 并致电start() <int-jms:message-driven-channel-adapter>。它是一个标识为AbstractEndpoint
  6. dsToT2 bean

    注意,您无法向null属性提供destination-name。当您尝试填充bean属性时,AC将在启动时失败。在这种情况下,将调用AbstractMessageListenerContainer#setDestinationName,然后进行检查 Assert.notNull(destinationName, "'destinationName' must not be null");。 但是,您可以尝试提供空字符串''而不是null,并为auto-startup属性添加类似的SpEL条件。

    HTH