异步任务后合并期间出错

Edd*_*ark 5 grails asynchronous grails-orm

我有一个基本上调用多个web服务的应用程序,存储从这些web服务接收的数据并将其呈现给用户.我有一个异步任务,调用所有的Web服务,它看起来像这样:

List<Promise> t = new ArrayList<Promise>()
def TIMEOUT_TIME = 6

    t[0] = task {
        def responseFrom0 = webserviceRequestService.getResponse(0)
        if(responseFrom0){
            return responseFrom0
        }
    }

    t[1] = task {
        def responseFrom1 = webserviceRequestService.getResponse(1)
        if(responseFrom1){
            return responseFrom1
        }
    }
Run Code Online (Sandbox Code Playgroud)

动作getResponse看起来像这样:

    List<ResponseResult> result = new ArrayList<TravelQuote>()

    try {
        wsClient = prepareRequestMap()
        wsResponse = externalWebservice.getQuotes(wsClient)
        wsResponse.responseList.each  {
            ResponseResult responseResult = new ResponseResult()

            //populate properties of ResponseResult
            responseResult.save(failOnError:true, flush:true)
            result.add(responseResult)

        }

    } catch(Exception e){
        log.error e.message
        e.printStackTrace()
    }

    return result
Run Code Online (Sandbox Code Playgroud)

最后,我收集了所有Web服务的响应,如下所示:

    result.each {
        if(it){
            try{
                it=it.merge()                                       
            }catch (Exception e){
                log.error("Error occured while merging responses... : ${e.message}")
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,这里的问题是我从最后一段代码中得到了这个例外

not-null属性引用null或transient值:ResponseResult.dateCreated; 嵌套异常是org.hibernate.PropertyValueException:not-null属性引用null或transient值:ResponseResult.dateCreated

dateCreated来自我在所有域类上实现的这个类.

abstract class AbstractPersistentObject implements Serializable{
    static final long serialVersionUID = 1L;    
    Date dateCreated
    Date lastUpdated    
}
Run Code Online (Sandbox Code Playgroud)

关于这个问题的奇怪之处在于,这只发生在生产环境中,无论我做什么,我都无法在任何其他环境中复制它.而且,一旦发生这种情况,服务器只会在每次运行代码时抛出该特定问题,直到服务器重新启动.重启后,此代码正常工作.

我的想法已经用完,任何人都有任何想法?

小智 2

答案似乎在于抛出的异常:外部 Web 服务返回的记录没有 dateCreated 字段的值。

根据我的经验,来自生产环境的数据几乎总是包含丢失或格式不正确的值。您应该通过更改 ResponseResult.dateCreated 的定义以允许空值来解决这一问题,并在代码中处理这种情况。