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 回答