Java 发送失败的原因
我正在使用KPL的addUserRecord发送书籍。我想:Java 发送失败的原因,java,amazon-kinesis,Java,Amazon Kinesis,我正在使用KPL的addUserRecord发送书籍。我想: 了解指定作者的所有书籍实际处理的时间(需要更新审计表) 记录每本书及其ISBN的成功与失败 我试了两件事 我创建了一张指向未来对象的ISBN地图。对于成功很好,但是对于失败,我无法访问UserRecordResult对象 Map<String,ListenableFuture<UserRecordResult>> sendResultFuturesMap = new HashMap<>();
Map<String,ListenableFuture<UserRecordResult>> sendResultFuturesMap = new HashMap<>();
ListenableFuture<UserRecordResult> resultFuture = producer.addUserRecord(kinesisStream, partitionKey, data);
sendResultFuturesMap.put(key, resultFuture);
...
// Verify
for(Map.Entry<String,ListenableFuture<UserRecordResult>> entry : sendResultFuturesMap.entrySet()) {
String key = entry.getKey();
ListenableFuture<UserRecordResult> resultFuture = entry.getValue();
UserRecordResult result = null;
try {
result = resultFuture.get();
} catch (Exception e) {
// I always get an ExecutionException that just says "com.amazonaws.services.kinesis.producer.UserRecordFailedException"
// the if below is never executed, so I never get the UserRecordResult object
if (e instanceof UserRecordFailedException) {
result = ((UserRecordFailedException) e).getResult();
}
}
}
Map sendResultFuturesMap=newHashMap();
ListenableFuture resultFuture=producer.addUserRecord(动画片流、分区键、数据);
sendResultFuturesMap.put(键,resultFuture);
...
//核实
对于(Map.Entry:sendResultFuturesMap.entrySet()){
String key=entry.getKey();
ListenableFuture resultFuture=entry.getValue();
UserRecordResult=null;
试一试{
result=resultFuture.get();
}捕获(例外e){
//我总是收到一个ExecutionException,上面写着“com.amazonaws.services.kinesis.producer.UserRecordFailedException”
//下面的if从未执行过,因此我从未得到UserRecordResult对象
如果(例如UserRecordFailedException的实例){
结果=((UserRecordFailedException)e).getResult();
}
}
}
我尝试了回调,成功和失败都能得到UserRecordResult对象,但我不确定如何将它链接到我的ISBN
ListenableFuture<UserRecordResult> resultFuture = producer.addUserRecord(kinesisStream, partitionKey, data);
com.google.common.util.concurrent.Futures.addCallback(resultFuture, kinesisSentCallback, resultFutureThreadPool);
private static FutureCallback<UserRecordResult> kinesisSentCallback = new FutureCallback<>() {
...
@Override
public void onFailure(Throwable t) {
//Works fine. I'm able to get the UserRecordResult object
if (t instanceof UserRecordFailedException) {
UserRecordFailedException e = (UserRecordFailedException) t;
UserRecordResult result = e.getResult();
// How do I get ISBN from the result object?
}
}
ListenableFuture resultFuture=producer.addUserRecord(动画片流、分区键、数据);
com.google.common.util.concurrent.Futures.addCallback(resultFuture、kinessentCallback、resultfutureadpool);
私有静态FutureCallback KinessEntCallback=新FutureCallback(){
...
@凌驾
失效时的公共无效(可丢弃的t){
//工作正常。我可以得到UserRecordResult对象
if(UserRecordFailedException的t实例){
UserRecordFailedException e=(UserRecordFailedException)t;
UserRecordResult=e.getResult();
//如何从结果对象获取ISBN?
}
}
我应该为每条消息创建一个新的回调吗?这似乎效率低下。ppl是如何做到的