0

我已经阅读了 rabbitMQ 插件的优秀文档。但是,我仍然对一些事情感到困惑。

设想

我的应用程序将从用户那里上传文件,对文件执行各种操作,并相应地在域对象上设置某些属性。其中一些工作可能是劳动密集型的,所以我正在使用队列。我设想请求被排队,消费者从队列中提取请求并使用它们。

问题

我想在队列中存储一个域对象。我这样做rabbitSend 'myqueue', colorObjcolorObj是域类的对象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
  }
}
4

2 回答 2

2

正如蒂姆所说,如果您只需传递最简单的域实例 ID 即可。但是,您确实需要注意在消息传输过程中对域实例的更改。

或者,如果它是您感兴趣的数据,我更喜欢使用类似的东西将对象序列化为 JSON

rabbitSend 'myqueue', (colorObj as JSON).toString()

当然,现在您的侦听器正在接收一个字符串,因此您必须将其转换回来:

void handleMessage(String message) {
    def color = new Color(JSON.parse(message))
    println "came in message: " + color instanceof Color
}

在GPRABBITMQ-15 问题上有一些关于此的讨论。

于 2013-08-07T11:53:13.753 回答
1

文档中所示,您可以发送 aString或 aMap

为什么不发送id您的域对象:

rabbitSend 'myqueue', colorObj.id

然后,在处理消息时将其重新加载:

void handleMessage(message) {
    println "Got ${Color.get( message )}"
}

或者,如果在处理消息之前不需要域对象,则发送所有所需数据的映射,并在成功处理后让服务创建域对象?

于 2013-08-07T11:51:09.193 回答