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 的定义以允许空值来解决这一问题,并在代码中处理这种情况。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |