0

我用表table-Atable-B.

put之后,我使用 JAVA(带有HBaseClientin )编写了将数据写入 HBase 的代码,org.hbase.async如下所示。

private HBaseClient client;

// ... (Somehow init client)

public Deferred<Object> asyncPut(PutRequest request, Object rowKey) {
        return client.put(request)
                .addCallback(new CloseCallback<>())
                .addErrback(new CloseErrCallback<>(rowKey, Boolean.FALSE));
    }

private class CloseCallback<R> implements Callback<R, R> {
        @Override
        public R call(R result) {
            return result;
        }
    }

private class CloseErrCallback<R> implements Callback<R, Exception> {
        private R defaultValue;
        private Object rowKey;

        CloseErrCallback(Object rowKey, R defaultValue) {
            this.rowKey = rowKey;
            this.defaultValue = defaultValue;
        }

        public R call(final Exception e) {
            if (e instanceof RpcTimedOutException) {
                log.info("{}, rowKey : {}", e.getMessage(), rowKey);
            } else if(e instanceof NonRecoverableException){
                log.error("RPC failed - rowkey:{} {}", rowKey, e);
            } else {
                log.error("RPC failed {} {}", e, rowKey);
            }
            return defaultValue;
        }
    }

当我放置具有表名table-C(尚未创建)的数据时,它不会出现错误,ERROR: Unknown table但只会重新尝试放置数据直到成功。

我想做的是捕获特定的异常ERROR: Unknown table或其他异常以防止重试。我希望CloseErrCallback可以捕获这些异常,但它不会帮助我。

异步将数据放入 HBase 时如何知道是否有异常?

4

0 回答 0