监听远程事件时IGNITE服务器挂起:Evt_NODE_LEFT [英] Ignite server hang there when listen to remote event: EVT_NODE_LEFT

查看:0
本文介绍了监听远程事件时IGNITE服务器挂起:Evt_NODE_LEFT的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两台配置了以下发现SPI的IGNITE服务器

TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47509"));
discoSpi.setIpFinder(ipFinder);

它们都在侦听远程事件:EVT_NODE_LEFT,当我关闭其中一个服务器时,会触发EVT_NODE_LEFT,我将在该节点上从IGNITE执行一些清理工作

IgniteEvents events = ignite.events();

IgnitePredicate<DiscoveryEvent> filter = evt -> {
    if (evt.eventNode().isClient()) {
        return true;
    }
    System.out.println("remote event: " + evt.name());
    System.out.println("remote event: " + evt.eventNode().consistentId());
    return true;
};
UUID uuid = events.remoteListen(new IgniteBiPredicate<UUID, DiscoveryEvent>() {

    @Override
    public boolean apply(UUID uuid, DiscoveryEvent e) {
        ClusterNode node = e.eventNode();
        if(node.isClient()) {
            return true;
        }
        String consistentId= node.consistentId().toString();
        IgniteCache<String, String> cache = ignite.getOrCreateCache("test");
        //some operation on cache...
        return true; //continue listening
    }
}, filter, EventType.EVT_NODE_LEFT);

当我在注册表项下有数据时,程序运行正常;如果我在注册表项下没有数据,服务器挂起并显示以下消息:

[2021-08-18 15:16:03,828][ERROR][tcp-disco-msg-worker-[crd]-#2-#42][G] Blocked system-critical thread has been detected. This can lead to cluster-wide undefined behaviour [workerName=disco-event-worker, threadName=disco-event-worker-#49, blockedFor=18s]
[15:16:03] Possible failure suppressed accordingly to a configured handler [hnd=StopNodeOrHaltFailureHandler [tryStop=false, timeout=0, super=AbstractFailureHandler [ignoredFailureTypes=UnmodifiableSet [SYSTEM_WORKER_BLOCKED, SYSTEM_CRITICAL_OPERATION_TIMEOUT]]], failureCtx=FailureContext [type=SYSTEM_WORKER_BLOCKED, err=class o.a.i.IgniteException: GridWorker [name=disco-event-worker, igniteInstanceName=null, finished=false, heartbeatTs=1629270945183]]]

调试后,我在调用ignite.getOrCreateCache(";test";)时发现,线程驻留在方法GridFutureAdapter.get0(Boolean IgnoreInterrupts)的LockSupport.park();行中,似乎正在等待脱机服务器的响应。我不知道为什么只有在没有数据的情况下才会发生这种情况,但在我的场景中,没有数据是常见的情况。我如何解决此问题?谢谢

Ignite版本:2.9.1

推荐答案

这是预期行为。不应在事件侦听器内执行任何阻塞操作,否则,您的线程可能会被阻塞。

事情是这样的-回调是在Ignite的内部线程上调用的,应该尽快完成。只需将回调逻辑转发到自定义线程池,就可以了。

或者,您也可以切换到以异步方式工作并且没有阻止机制的Continuous Query

这篇关于监听远程事件时IGNITE服务器挂起:Evt_NODE_LEFT的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆