1

我正在研究一个用例,其中 ignite 必须侦听数据网格中对象属性的更改并对该对象执行一些操作。为了性能,我希望在数据所在的同一节点上完成处理。

  • 如何在对象的属性更改为特定值时获取事件(例如,对象' X'有一个属性' '从' 'state设置为' ')并确保仅从节点获取事件对象住在哪里?scheduledcreated

  • 我如何确保当我得到事件并开始处理它时,在处理完成之前没有其他人更改对象(只允许读取)(换句话说,一旦事件被拾取,事务就会开始)?

  • 如何确保处理代码部署到所有节点(处理是无状态的)并且它只对本地数据进行操作(数据对象和代码之间没有硬链接,换句话说,如果处理代码在未来,物体保持不变)

我从文档中得到的内容如下:

// Local listener that listenes to local events.
IgnitePredicate<CacheEvent> locLsnr = evt -> {


  // CODE

  return result;
};

// Subscribe to specified cache events occuring on local node.
ignite.events().localListen(locLsnr,
  EventType.EVT_CACHE_OBJECT_PUT);
  • CODE街区;我必须检查state' ' 上的更改evt.newValue(),不能早点完成吗?IE。作为 localListen 的参数?

  • CODE块中,对象是否被锁定,直到我返回结果?换句话说,是否在这里我确信没有人可以更改对象并且我可以安全地更改我的对象?IMO 在“谓词”定义中而不是在处理程序类中这样做是一个奇怪的地方。

斯文

4

1 回答 1

2

斯文,

您的代码看起来正确,应该可以按预期工作。回答您的问题:

  • 事件侦听器在值更新后立即调用,因此我认为可以在侦听器内部检查您感兴趣的字段。如果字段未更改,则立即返回。
  • 该对象被锁定,因为在条目的同步块内调用了侦听器。您可以修改同一个对象,但我不建议在侦听器内执行任何同步操作,例如缓存更新,因为它容易出错并且会影响性​​能。您应该异步执行此操作,以便尽快释放锁。
于 2016-01-05T22:46:09.787 回答