【发布时间】:2016-07-16 09:02:26
【问题描述】:
我使用 AsyncRestTemplate 来异步制作 resttemplate。
这些方法应该等待所有 asyncresttemplate 进程完成,并且它会返回 reviewContent。
问题是回调方法不起作用,在整个方法完成之前。所以我不能正确返回 optionName 和membershipGradeCode 的值,reviewType 应该包含在reviewContent 中。
有人能解释一下我现在缺少什么吗?
rev#1 成功回调方法改变了reviewContent的状态,会不会有问题?
public ReviewContent getRepresentativeReviewContent(Long dealNo, Long categoryNo, String setId) {
Optional<Map<String, Object>> review = Optional.ofNullable(boardApi.getRepresentativeReviewContent(dealNo));
if (review.isPresent()) {
Long memberNo = Long.valueOf(review.get().get("memberNo").toString());
ReviewContent reviewContent = new ReviewContent();
ListenableFuture<ResponseEntity<Map>> optionInfo = dealApi.asyncGetDealOption(Long.valueOf(review.get().get("optionNo").toString()));
optionInfo.addCallback(success -> {
try {
reviewContent.setOptionName((String) ((Map<String, Object>) success.getBody().get("data")).get("dealTitle"));
} catch (Exception e) {
reviewContent.setOptionName(null);
}
}, failure -> LOGGER.error("asyncGetDealOption", failure.getStackTrace()));
ListenableFuture<ResponseEntity<Map>> gradeInfoOfThisMember = mktApi.asyncGetMembershipGradeOfThisMember(memberNo);
gradeInfoOfThisMember.addCallback(success -> {
try {
reviewContent.setMembershipGradeCode((Integer) ((Map<String, Object>) success.getBody().get("data")).get("grade"));
} catch (Exception e) {
reviewContent.setMembershipGradeCode(0);
}
},
failure -> {
reviewContent.setMembershipGradeCode(0);
LOGGER.error("asyncGetMembershipGradeOfThisMember", failure.getStackTrace());
});
ListenableFuture<ResponseEntity<ReviewType>> reviewTypeByCategoryNo = boardApi.asyncGetReviewTypeByCategoryNo(categoryNo, setId);
reviewTypeByCategoryNo.addCallback(success -> {
try {
reviewContent.setReviewType(success.getBody());
} catch (Exception e) {
reviewContent.setReviewType(null);
}
},
failure -> {
reviewContent.setReviewType(null);
LOGGER.error("asyncGetReviewTypeByCategoryNo", failure.getStackTrace());
});
reviewContent.setReviewCount((Integer) review.get().get("reviewCount"));
reviewContent.setReviewAvgScore((Double) review.get().get("reviewAvgScore"));
reviewContent.setContents((String) review.get().get("contents"));
reviewContent.setCreateDt((String) review.get().get("createdDt"));
reviewContent.setUpdateDt((String) review.get().get("updatedDt"));
reviewContent.setMemberSrl(memberNo);
reviewContent.setTitle((String) review.get().get("title"));
reviewContent.setAccountSrl(Long.valueOf(review.get().get("accountNo").toString()));
reviewContent.setMemberId((String) review.get().get("memberId"));
reviewContent.setAccountSrl(Long.valueOf(review.get().get("accountNo").toString()));
boolean isApiExecutionDone = false;
while (!isApiExecutionDone) {
if (gradeInfoOfThisMember.isDone() && optionInfo.isDone() && reviewTypeByCategoryNo.isDone()) {
isApiExecutionDone = true;
}
}
return reviewContent;
}
return new ReviewContent();
}
【问题讨论】:
-
SO 不适合为您调试代码。你甚至不说什么是行不通的。您是否尝试过将问题简化为更简单的测试用例?实际上,您尝试过什么?
-
@FrankPavageau 抱歉,没有测试用例。问题是回调方法不起作用。由于等待三个 AsyncRestTemplate 结果,我在方法结束时做了 while 语句。 dealApi.asyncGetDealOption, mktApi.asyncGetMembershipGradeOfThisMember(memberNo); gradeInfoOfThisMember,boardApi.asyncGetReviewTypeByCategoryNo
-
首先,
ListenableFuture返回的AsyncRestTemplate是一个 Spring 类,而不是 Guava 类。使用您的调试器,在第一个异步调用和各种回调中设置断点,然后进入方法以找出任务在哪个线程或线程池上提交,查看使用的队列等。问题仅在于回调,或者Futures 永远不会完成? -
@FrankPavageau 我已经调试过了,但我无法解决这个问题。我认为回调正在工作,但在回调方法工作之前返回了 reviewContent。当我调试时,如果我停在“.isDone”点并等待几秒钟,reviewContent 会正确返回。我不知道这是什么......线程有问题吗?还是 isDone 有问题??
-
'无法正常工作'不是问题描述。愚蠢的标题。投反对票。
标签: java asynchronous callback resttemplate spring-web