ApacheIgnite侦听本地节点中对象的状态更改

ApacheIgnite侦听本地节点中对象的状态更改,ignite,Ignite,我正在调查一个用例,其中ignite必须侦听数据网格中对象属性的更改,并对该对象执行一些操作。为了提高性能,我希望处理在数据所在的同一节点上完成 当对象的属性已更改为特定值时(例如,对象“X”具有属性“state”,该属性从“created”设置为“scheduled”),如何获取事件,并确保仅从对象所在的节点获取事件 我如何确保当我获取事件并开始处理它时,在处理完成之前,没有其他人更改对象(只允许读取)(换句话说,事务在拾取事件后立即开始) 如何确保将处理代码部署到所有节点(处理是无状态的)

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

  • 当对象的属性已更改为特定值时(例如,对象“
    X
    ”具有属性“
    state
    ”,该属性从“
    created
    ”设置为“
    scheduled
    ”),如何获取事件,并确保仅从对象所在的节点获取事件

  • 我如何确保当我获取事件并开始处理它时,在处理完成之前,没有其他人更改对象(只允许读取)(换句话说,事务在拾取事件后立即开始)

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

我从文件中得到的信息如下:

// 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);
//侦听本地事件的本地侦听器。
点火开关locLsnr=evt->{
//代码
返回结果;
};
//订阅在本地节点上发生的指定缓存事件。
ignite.events().localListen(locLsnr,
EVT_缓存_对象_放置);
  • code
    块中;我必须检查“
    evt.newValue()
    ”上的
    状态
    更改,不能早一点进行吗?也就是说,作为一个局部监听的参数

  • code
    块中,在我返回结果之前对象是否已锁定?换句话说,就是在这里,我确信没有人可以改变这个对象,我可以安全地改变我的对象吗?在我看来,在“谓词”定义中而不是在处理程序类中这样做是一个奇怪的地方

斯文

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

  • 事件监听器在值更新后立即调用,因此我认为检查监听器中您感兴趣的字段是可以的。如果字段没有更改,请立即返回
  • 对象被锁定,因为侦听器在条目的同步块内被调用。您可以修改同一个对象,但我不建议在侦听器中执行任何同步操作,如缓存更新,因为它容易出错,并且会影响性能。您应该异步执行此操作,以便尽快释放锁

最后一个答案是:缓存更新应该如何异步完成?对象实际上可能不会在…@Sven之间更改,如果您希望以原子方式更新两个或多个缓存值,则不应使用事件,只需打开事务并在其中执行所有缓存操作。如果由于某种原因无法在客户端启动事务,请将闭包发送到适当的服务器节点()并在那里运行事务。用例如下:对象的状态更改,网格上的意思,必须通过执行代码来执行操作(即基于事件,不涉及客户端)。执行代码时,在停止执行并更新对象之前,不应再更改对象。我如何在不使用事件的情况下执行此操作?你的意思是在对象上的侦听器中使用异步仿射运行吗?@Sven谁启动对象的初始更新?通过来自前端的请求(例如Web服务器)的网格的一些随机客户端