2012-06-28 71 views
0

我使用以下代碼創建int-jms:消息驅動通道適配器,但是,似乎它基於輪詢,因爲它在1秒內返回數據間隔而不是對滴答作出迴應。Spring集成DSL消息驅動的jms偵聽器使用輪詢器代替

我定義的流程如下:

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

的問題是,如何使消息驅動?

回答

1

我檢查了scala dsl中的底層實現,發現它默認創建jms:inbound-gateway(不是消息驅動的通道適配器),它在內部使用DefaultMessageListenerContainer。所以是的,它在內部是一個消息驅動的容器,但是因爲它似乎使用了網關組件,所以它有一個請求/回覆類型的流,這可能是您看到的1秒延遲而不是輪詢。

+0

是的,我也找到了。有沒有辦法讓它pub-sub? – nau

+0

我重新使用MessageListener並需要將JMS TextMessage轉換爲Spring集成消息。有沒有簡單的方法來做到這一點? – nau

+0

你真的不需要做任何事情來做這種轉換--Spring Integration自動將消息從JMS映射到內部的Spring Integration消息結構。 –

1

OK,作爲一種解決方法我手動創建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(消息)是我的處理功能,並

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流定義。

相關問題