我有代码:
SqlTemplate
.forQuery(client, "SELECT * FROM user WHERE id=#{id}")
.execute(parameters)
.onSuccess(users -> {
users.forEach(row -> {
// exception here
System.out.println(row.get(UUID.class, "id1") + " " + row.getString("title"));
});
})
处理消费者异常的最佳方式是什么?目前,如果出现异常,它将被吞噬。。。
假设您想在抛出异常时使流失败,那么最好使用compose来迭代用户,并分别处理.onSuccess()
和.onFailure()
。
您可以使用CompositeFuture
来实现这一点。您可以有一个Future列表,并在forEach
循环中将successedFuture/failedFuture(在异常情况下(添加到该列表中。
SqlTemplate
.forQuery(client, "SELECT * FROM user WHERE id=#{id}")
.execute(parameters)
.compose(users -> {
List<Future> usersFuture = new ArrayList<>();
users.forEach(row -> {
try {
// exception here
System.out.println(row.get(UUID.class, "id1") + " " + row.getString("title"));
usersFuture.add(Future.succeededFuture());
} catch (Exception e) {
usersFuture.add(Future.failedFuture(e));
}
});
return CompositeFuture.all(usersFuture).mapEmpty();
})
.onSuccess(res -> {
// end the flow with success
})
.onFailure(e -> {
// Add error message and fail the flow
});
此外,总的来说,我对这里可以抛出的异常感到好奇。由于这是您在验证后写入数据库的数据,因此您应该意识到可能的错误场景,并在不使流失败的情况下相应地处理它们。