您好我在我的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)
}
}
答案 0 :(得分: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似乎没有很好的支持。见Can I control plugin load order from outside a plugin in Grails?
另一个解决方案,只有在本地安装插件时才可用,是指定插件在任何插件导致问题后加载,
例如,
def loadAfter = ['services']
变为
def loadAfter = ['services', 'converters', 'mail']