0

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

我定义的流程如下:

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

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

4

2 回答 2

1

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

于 2012-06-29T00:52:48.300 回答
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 流定义。

于 2012-06-29T15:31:41.623 回答