【问题标题】:Spring Integration DSL message driven jms listener uses poller insteadSpring Integration DSL 消息驱动的 jms 监听器使用轮询器代替
【发布时间】:2012-06-30 12:48:21
【问题描述】:

我使用以下代码创建了一个 int-jms:message-driven-channel-adapter,但是,它似乎是基于轮询的,因为它以 1 秒的间隔返回数据,而不是响应滴答声。

我定义的流程如下:

jms.listen(requestDestinationName = "myTopic", connectionFactory = connectionFactory).additionalAttributes(requestPubSubDomain = true) --> ...

问题是,如何让它成为消息驱动的?

【问题讨论】:

    标签: scala spring-integration


    【解决方案1】:

    好的,作为一种解决方法,我手动创建 SubscribableJmsChannel:

    lazy val subscribeChannel = {
      val c = new SubscribableJmsChannel(jmsContainer, jmsTemplate)
      c.afterPropertiesSet()
      c.subscribe(new MessageHandler {
        def handleMessage(message: Message[_]) {processMessage(message)}
      })
      c
    }
    
    subscribeChannel.start()
    

    其中 processMessage(message) 是我的处理函数,并且

    lazy val jmsContainer= {
        val c = new DefaultMessageListenerContainer
        c.setConnectionFactory(connectionFactory)
        c.setDestination(dest)
        c.setPubSubDomain(true)
        c.afterPropertiesSet()
        c
     }
    

    请注意,SubscribableJmsChannel 不会将 JMS 属性映射到 SI 消息头!我不得不回退到使用 Spring Integration XML 流定义。

    【讨论】:

      【解决方案2】:

      我检查了 scala dsl 中的底层实现,发现它默认创建一个jms:inbound-gateway(不是消息驱动通道适配器),它在内部使用一个 DefaultMessageListenerContainer。所以是的,它是一个内部消息驱动的容器,但因为它似乎使用网关组件,它具有请求/回复类型的流,这可能是您看到的 1 秒延迟,而不是轮询。

      【讨论】:

      • 是的,我也发现了。有没有办法让它发布-订阅?
      • 我回退到使用 MessageListener 并且需要将 JMS TextMessage 转换为 Spring Integration Message。有什么简单的方法吗?
      • 你真的不需要做任何事情来进行转换 - Spring Integration 自动将消息从 JMS 映射到内部 Spring Integration 消息结构。
      • 我看到它使用了 DefaultMessageListenerContainer。我有两个选择 - 要么使用入站网关启用 pub-sub 语义,要么编写我自己的 MessageListener,读取 JMS TextMessage 并将其发送到进一步的 Spring Integraion 流(过滤器、转换等)。为此,我需要将从 MessageListener 获得的 TextMessage 转换为 Spring Integration Message。如果只做 def onMessage(msg: javax.jms.Message) = transform { m: Message[String] => handleMessage(m); m }.send(msg) 它抛出原因:java.lang.ClassCastException: com.tibco.tibjms.TibjmsTextMessage 不能转换为 java.lang.String
      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2012-07-21
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多