2016-05-25 11 views
0

私のシステムで生成されたイベントを外部システムで購読できるシステムがあります。システムは内部メッセージ用にRabbitMQ pluginを使用してGrails 2で書かれています。外部システムへのイベントは、HTTP経由で通信されます。RabbitMQプラグインを使用してGrailsでキューランタイムを作成

低速のサブスクライバエンドポイントが他のサブスクライバへのメッセージを遅らせるのを防ぐために、各サブスクライバのキューを作成したいとします。サブスクリプションは実行時に発生する可能性があります。そのため、アプリケーション構成でキューを定義することは望ましくありません。

Grails RabbitMQプラグインを使用してトピックバインディングランタイムでキューを作成するにはどうすればよいですか?

RabbitMQキューからのメッセージの読み取りはサービスに直接結合されているため、キューのランタイムを作成する際の副次的な問題は、そのGrailsサービスの複数のインスタンスを持つことです。何か案は?

答えて

0

は私が春を使用して終了しましたAMQPはGrails RabbitMQプラグインで使用されます。サンプルに関係のないいくつかのメソッド/引数が削除されました。

-1

これをチェックすることを強くお勧めします(https://www.infoq.com/presentations/api-io-state)。 Grails 3.1のIOプラグインと抽象API機能をコントローラから共有するためのAPIプラグインを提出したので、分散アーキテクチャーのサービスと共有することができますが、Grailsチームはコミュニティの他のユーザーとは違うルールを適用したいようです。

あなたの問題は解決しますが、おそらくリリースされることはありません。

1

私はあなたのための準備ができて解決策を持っていないが、あなたはRabbitmqGrailsPlugin Descriptor特にdoWithSpringセクション にコードをたどる場合は、実行時に動的に新しいQueueと関連Listenerを初期化するために必要な手順を再作成することができるはずです。

すべてが必要なパラメータを渡し、必要な豆を登録してリスナーを開始するようになります。

2番目の質問に答えるために、いくつかの命名規則を考え出し、キューごとに新しいキューハンドラを作成することができます。動的に春のBeanを作成する方法の例では、ここで見つけることができます:私はすぐにキューを登録する方法をdynamically declare beans

だけ短い例では、それははるかに配線などを必要と...

def createQ(queueName) { 
    def queuesConfig = { 
     "${queueName}"(durable: true, autoDelete: false,) 
    } 
    def queueBuilder = new RabbitQueueBuilder() 
    queuesConfig.delegate = queueBuilder 
    queuesConfig.resolveStrategy = Closure.DELEGATE_FIRST 
    queuesConfig() 

    queueBuilder.queues?.each { queue -> 
     if (log.debugEnabled) { 
      log.debug "Registering queue '${queue.name}'" 
     } 
     BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Queue.class); 
     builder.addConstructorArgValue(queue.name) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.durable)) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.exclusive)) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.autoDelete)) 
     builder.addConstructorArgValue(queue.arguments) 
     DefaultListableBeanFactory factory = (DefaultListableBeanFactory) grailsApplication.mainContext.getBeanFactory(); 
     factory.registerBeanDefinition("grails.rabbit.queue.${queue.name}", builder.getBeanDefinition()); 
    } 
} 
関連する問題