Bạn có thể xây dựng phương pháp helper của riêng bạn trong Groovy để đóng gói thử lại logic này.
def retry(int times = 5, Closure errorHandler = {e-> log.warn(e.message,e)}
, Closure body) {
int retries = 0
def exceptions = []
while(retries++ < times) {
try {
return body.call()
} catch(e) {
exceptions << e
errorHandler.call(e)
}
}
throw new MultipleFailureException("Failed after $times retries", exceptions)
}
(Giả sử một định nghĩa của MultipleFailureException tương tự như GPars' AsyncException)
sau đó trong mã, bạn có thể sử dụng phương pháp này như sau.
retry {
errorProneOperation()
}
hay, với một số lượng khác nhau của lần thử lại và hành vi xử lý lỗi:
retry(2, {e-> e.printStackTrace()}) {
errorProneOperation()
}
Bây giờ nếu 'IllegalStateException' sẽ sử dụng một trong những trường hợp ngoại lệ (người đầu tiên cuối cùng khó để nói?) Như nguyên nhân của nó, nó sẽ được ** nhiều ** hữu ích hơn, như bạn có thể thấy ** tại sao ** nó không thành công. Trong sản xuất, tôi sẽ không muốn một stacktrace được in mỗi khi một nỗ lực thất bại. Tôi chỉ muốn biết về nó nếu mọi lần thử lại thất bại. –
Cảm ơn Joachim - về đề nghị của bạn tôi đã thêm vào trong việc thu thập các ngoại lệ riêng lẻ. Đối với không muốn một stacktrace - chắc chắn, nó chỉ có để minh họa cho điểm. Khi các ngoại lệ hiện đang được thu thập để báo cáo ở cuối, có lẽ mục đích của errorHandler là đặt lại bất kỳ tài nguyên nào được yêu cầu trước khi 'body.call()' được thử lại - trong trường hợp đó, đóng cửa mặc định chỉ có thể là '{->} ' – winstaan74
Tôi đã sử dụng một cái gì đó rất giống nhau. cảm ơn winstaan. –