我已经阅读了RabbitMQ插件的出色文档。但是,我仍然对一些事情感到困惑。
场景
我的应用程序将从用户上载文件,对文件执行各种操作,并相应地在域对象上设置某些属性。其中一些工作可能需要大量劳动,因此我正在使用队列。我设想将请求排队,并且消费者从队列中提取请求并使用它们。
问题
我想将域对象存储在队列中。我这样做是:rabbitSend 'myqueue', colorObj
。 colorObj
是域类Color
的对象
但是,在ColorService
中handleMessage(...)
当我从队列中获取项目时,该项目的类型不是Color
。请注意,在rabbitMQ仪表板上,我可以看到正在队列中插入的项目,因此我在config.groovy
中启动队列很好(我正在使用amq.direct
)
handleMessage
。即使我不调用ColorService
,它仍然会自行执行handleMessage
。这是正常现象吗? 下面是代码:
控制者
Color colorObj = colorService.newRequest(params, request.getFile('color.filename')
if (colorObj.validate)
rabbitSend 'myqueue', colorObj
...
服务
class ColorService {
static rabbitQueue = 'myqueue'
void handleMessage(message) {
println "came in message: " + message instanceof Color //this prints false
}
}
最佳答案
如图所示in the documentation,您可以发送String
或Map
为什么不发送您的域对象的id
:
rabbitSend 'myqueue', colorObj.id
然后,在处理消息时将其重新加载:
void handleMessage(message) {
println "Got ${Color.get( message )}"
}
或者,如果在处理完消息之前不需要域对象,则发送所有必需数据的映射,并让服务在成功处理后创建域对象?
关于grails - 如何使用RabbitMQ插件和Grails发送和接收域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102329/