grails - 由消息队列触发时,Grails服务未保存域对象

标签 grails message-queue

我有一个grails应用程序,该应用程序具有创建报告的服务。该报告定义为:

class Report {
    Date createDate
    String reportType
    List contents

    static constraints = {
    }
}

该服务将生成一个报告,并将contents填充为createCriteria返回的列表。

我的问题是我的服务声称要保存该报告,没有错误出现,日志记录说它全部存在,但是当我从该报告的 Controller 调用show时,它说内容为空。

另一个相关的方面,我的服务由ActiveMQ消息队列调用。该消息源自我的报表 Controller 。

Controller :
class ReportController {

    def scaffold = Report

    def show = {
        def rep = Report.get(params.id)

        log.info("Report is " + (rep? "not null" : "null")) //says report is not null
        log.info("Report content is " + (rep.contents? "not null" : "null")) //always says report.contents is null.

        redirect(action: rep.reportType, model: [results: rep.contents, resultsTotal: rep.contents.size()])
    }
}

我创建报告的服务:
class ReportService {

static transactional = false
static expose = ['jms']
static destination = "Report"

void onMessage(msg) 
{
    this."$msg.reportType"(msg)
}

void totalQuery(msg) 
{       
   def results = Result.createCriteria().list {
       //This returns exactly what i need.
   }

   Report.withTransaction() {
       def rep = new Report(createDate: new Date(), reportType: "totalQuery", contents: results)

       log.info("Validation results: ${rep.validate()}")

       if( !rep.save(flush: true) ) {
           rep.errors.each {
                log.error(it)
           }
        }
   }
}

有什么明显的我想念的地方吗?我的想法是,由于我所有的单元测试都有效,因此休眠上下文不会通过消息队列传递。但这会产生异常,不是吗?几天来,我一直在想这个问题,所以朝正确的方向发展将是一件很不错的事情。

谢谢,

最佳答案

您不能像这样定义任意的List,因此它会被忽略并被视为 transient 。如果您有一个def name字段,您将得到相同的行为,因为在两种情况下,Hibernate都不知道数据类型,因此它不知道如何将其映射到数据库。

如果要引用结果的集合,则需要一个hasMany:

class Report {
   Date createDate
   String reportType

   static hasMany = [contents: Result]
}

如果您需要有序列表,那么还要添加一个具有相同名称的List字段,而不是创建Set(默认),而是List:
class Report {
   Date createDate
   String reportType

   List contents
   static hasMany = [contents: Result]
}

您的单元测试之所以有效,是因为您没有访问数据库或使用Hibernate。我认为最好始终集成测试域类,以便您至少使用内存数据库,并在测试 Controller ,服务等时模拟域类。

关于grails - 由消息队列触发时,Grails服务未保存域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043028/

相关文章:

grails - 在Grails中使用Amazon SES时出错

grails - Grails外部配置

for-loop - Golang 中的事件驱动模型

RabbitMQ — 为什么错误的订阅者会收到已发布的消息?

asynchronous - 实现可靠异步消息访问的服务版本控制的权衡?

synchronization - 消息队列是地理分布式部署的正确工具吗?

Java消息队列抽象

grails - 在Grails中的单独文件中记录log4j消息

facebook-graph-api - Facebook Graph API帖子错误地显示了一些消息字符

grails - 在 Grails 中使用动态查找器搜索值