3

こんにちは、Grails アプリケーション内で RabbitMQ を使用しており、リスナーの開始を遅らせる方法を探しています。アプリケーションの配線全体が完了する前にそれらが開始されるようになったので、起動後に開始したいと思います..これを行う方法について何か提案はありますか?

これにはxml構成を使用しています..

<rabbit:listener-container connection-factory="connectionFactory" message converter="jsonMessageConverter" acknowledge="auto">
    <rabbit:listener queue-names="log.soap.in" ref="logSoapInListener" />
</rabbit:listener-container>

そのため、grails アプリケーションを開始するとコンテキストが開始されますが、すべてが接続されるまでに時間がかかります。したがって、アプリケーションの開始時にリスナーは既に呼び出されていますが、メッセージを正しく処理できません。

class LogSoapListenerService implements MessageListener {

    LogSoapService logSoapService

    JsonMapper jsonMapper

    @Override
    void onMessage(Message message) {
        String body = new String(message.body, message.properties.contentEncoding ?: "UTF-8")
        logSoapService.process(body)
    }
}
4

1 に答える 1

0

私は同様の問題に遭遇し、これが最終的にRabbitmqGrailsPluginファイルに追加されたもので、プロジェクトの一部としてローカルバージョンを持っています。

メソッドの中でdoWithApplicationContext、私は変更しました、

// Now that the listener is properly configured, we can start it.
bean.start()

// Now that the listener is properly configured, we can start it.
def startDelay = application.config.rabbitmq.startDelay ?: 0
new Timer().runAfter(startDelay, {
    bean.start()
})

次に、必要rabbitmq.startDelayな遅延を設定するために構成するだけです。

より洗練された解決策は、rabbitmq が他のプラグインの後にロードされるようにすることですが、Grails はそれを適切にサポートしていないようです。Grails でプラグインの外部からプラグインのロード順序を制御できますか? を参照してください。

プラグインがローカルにインストールされている場合にのみ利用可能な別の解決策は、プラグインが問題を引き起こしている後にプラグインをロードするように指定することです。

例えば、

def loadAfter = ['services']

になる

def loadAfter = ['services', 'converters', 'mail']
于 2014-06-12T18:31:00.517 に答える