grails - 如何使用RabbitMQ插件和Grails发送和接收域对象

标签 grails groovy rabbitmq messaging

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

场景

我的应用程序将从用户上载文件,对文件执行各种操作,并相应地在域对象上设置某些属性。其中一些工作可能需要大量劳动,因此我正在使用队列。我设想将请求排队,并且消费者从队列中提取请求并使用它们。

问题

我想将域对象存储在队列中。我这样做是:rabbitSend 'myqueue', colorObjcolorObj是域类Color的对象
但是,在ColorServicehandleMessage(...)当我从队列中获取项目时,该项目的类型不是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,您可以发送StringMap
    为什么不发送您的域对象的id:

    rabbitSend 'myqueue', colorObj.id
    

    然后,在处理消息时将其重新加载:
    void handleMessage(message) {
        println "Got ${Color.get( message )}"
    }
    

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

    关于grails - 如何使用RabbitMQ插件和Grails发送和接收域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102329/

    相关文章:

    java - Spring Cloud Stream支持动态路由消息

    grails - GORM中是否有 'not in'等效项?

    api - 休息APi用户注册

    grails - 如何将列表作为参数添加到grails中的sqlQuery?

    rabbitmq - 在RabbitMQ中,如何使用特定的 key 消费多条消息或读取队列中的所有消息或交换的所有消息?

    python - RabbitMQ 心跳与连接耗尽事件超时

    spring - Spring命令行JSON配置包含数组

    grails - Grails-如何从另一个 Controller 保存一个类实例?

    java - Gradle 'exclude' 本地 `fileTree` 来自子项目的传递依赖

    Grails 安全登录设计问题以及库和数据库选择