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

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(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 に答える