java - Ignite SqlQuery 超时和取消 - 如果/何时抛出 QueryCancelledException

标签 java ignite gridgain

正如该文档建议的那样,可以通过设置 https://ignite.apache.org/releases/2.4.0/javadoc/org/apache/ignite/cache/query/SqlQuery.html#setTimeout-int-java.util.concurrent.TimeUnit- 在执行 SqlQuery 时设置超时

QueryCancelledException 的文档还提到,如果查询在执行时被取消或超时,则会抛出已检查的异常,https://ignite.apache.org/releases/2.4.0/javadoc/org/apache/ignite/cache/query/QueryCancelledException.html

这里提到了同样的方法来取消/超时长时间运行的查询, https://apacheignite-sql.readme.io/v2.4/docs/query-cancellation

但奇怪的是所有 IgniteCache.query(..) 方法的 java 文档,https://ignite.apache.org/releases/2.4.0/javadoc/org/apache/ignite/IgniteCache.html#query-org.apache.ignite.cache.query.Query-不声明此已检查异常或任何已检查异常被抛出(与 QueryCursor.getAll() 方法相同)导致混淆在何处以及如何编码查询超时处理。

我编写了以下代码,但无法使查询超时以快速测试我的代码路径部分并查看其是否正确。我希望在 IgniteCache.query(..) 方法和 QueryCursor.getAll() 及其相关方法中都会抛出异常。

显然,SqlQuery.setTimeout(int timeout, TimeUnit timeUnit) 的最小超时粒度是 TimeUnit.MILLISECONDS,我在初始测试期间意识到这使得强制测试超时变得更加困难。

下面的代码看起来正确吗? (我想避免使用游标方法并依赖在 try-with-resources 中调用的 IgniteCache.query(..) 来检测超时)。这行得通吗?

@Scheduled(fixedDelayString = "${checkInterval}", initialDelayString = "${checkDelay}")
private final void monitorHealth() {
    if(!isReady) {
        return;
    }
    try (QueryCursor<Entry<Integer, FabricInfo>> cursor = fabricInfoCache.query(SQL_QUERY)) {
        cursor.iterator();
        // Reset the query time out counter..
        if(retryCount != 0) {
            retryCount = 0;
            LOGGER.warn("Client health check query executed without getting timed out before the configured maximum number of timeout retries was reached. Reseting retryCount to zero.");
        }
    } catch (Exception e) {
        if(e.getCause() instanceof QueryCancelledException) {
            retryCount++;
            LOGGER.warn("Client health check query timed out for the {} time.", retryCount);

            if(retryCount > QUERY_MAX_RETRIES_VALUE) {
                // Query timed out the maximum number of times..
                LOGGER.error("Client health check query timed out repeatedly for the maximum number of times configured : {}. Initating a disconnect-reconnect.", retryCount);
                reconnectAction();
            }
        } else {
            if (e.getCause() instanceof IgniteClientDisconnectedException) {
                LOGGER.error("Client health check query failed due to client node getting disconnected from cluster. Initating a disconnect-reconnect.", e.getCause());
            } else {
                // Treat other failures like CacheStoppedException, etc same as IgniteClientDisconnectedException...
                LOGGER.error("Client health check query failed. Initating a disconnect-reconnect.", e.getCause());
            }
            reconnectAction();
        }
    }
}

谢谢 穆图

最佳答案

QueryCancelledExceptionQueryCursor 的方法中抛出, 包裹成 IgniteException ,它是 RuntimeException 的子类。

在您调用 IgniteCache#query(...) 后查询不会立即执行方法。它只会在调用 QueryCursor#iterator() 方法时发生。

例如,您可以查看 Ignite 项目中的以下测试,该测试检查是否遵守查询取消和超时:IgniteCacheLocalQueryCancelOrTimeoutSelfTest .

关于java - Ignite SqlQuery 超时和取消 - 如果/何时抛出 QueryCancelledException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51357300/

相关文章:

java - Ignite Compute : Is it possible to continue jobs execution while the client is gone ?(例如崩溃)

java - 使用spring data jpa点燃使用语法IN

java - 启动 GridGain 节点

java - 使用 Swing 设置选定的文本颜色

Java 枚举 - 稍后转换的存储类型

java - 如何在intellij中设置默认的IGNITE_HOME环境变量

ignite - GridGain Server 分区丢失

caching - 如何在 Apache Ignite 2.0 上存储堆外数据

java - 我的二进制到十进制转换器的整数大小限制存在问题,不确定如何正确实现 long

java - getResourceAsStream 返回空值