【问题标题】:IgniteMesssaging works in sync modeIgniteMesssaging 在同步模式下工作
【发布时间】:2017-06-21 12:01:45
【问题描述】:

Ignite(2.0) Messaging 的发送功能似乎在同步模式下工作,它会被监听器阻塞。下面是我的测试代码。

ignite.message().localListen("TEST", (nodeId, Msg) -> {
    try {
        Thread.sleep(500);
    } catch (Exception ex) {
    }

    return true;
});



for (int i = 0; i < 100; i++) {
    ignite.message().send("TEST", "Hello World");
}

发送100条消息大约需要50秒,几乎等于睡眠时间500 ms * 100。似乎同步模式下的发送功能不是异步模式。

有人知道如何在异步模式下更改发送功能吗?

提前致谢。

【问题讨论】:

    标签: asynchronous synchronization messaging ignite


    【解决方案1】:

    似乎在添加新 API 时错过了异步侦听器调用,但您仍有两个选择:

    1. 使用已弃用的withAsync(),除非将添加sendAsync()
    2. 例如,如果您始终返回 true,则在谓词中传递您自己的 Executor。

    我刚刚为那个IGNITE-5570开了一张票

    【讨论】:

    • 嗨 Mitya,感谢您的回答,是的,我们可以使用 withAsync() 以异步模式发送消息,但是您知道为什么这个功能在 v2 中被弃用了吗?还有一个问题,sendOrdered() 函数是否始终处于同步模式,无论我们是否使用withAsync()
    • withAsync() 是令人困惑的 API,因为并非所有方法都尊重该标志,因此决定通过添加返回未来的 xxxAsync() 方法来更改它。所以在 AI 3.0 中旧的 API 将被完全删除。是的,sendOrdered() 不检查异步标志,可能这个功能被遗漏或以前不需要。
    • 那么,你打算发布2个用于异步发送消息的api,一个是sendAsync(),另一个是sendOrderedAsync(),对吧?
    【解决方案2】:

    您似乎在一个节点内进行测试。在这种情况下,没有消息发送并且监听器被同步调用。在 Ignite 中网络通信是异步的,所以如果你在两个节点上进行测试,你应该不会看到这样的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 2015-04-05
      • 1970-01-01
      • 2013-12-18
      • 2014-12-09
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多