首页 > 解决方案 > 如何序列化 Runnable 以在另一个 infinispan 节点上执行代码

问题描述

我正在尝试在 infinispan 集群的成员节点上执行一些代码,但我一直收到相同的错误。

org.infinispan.commons.marshall.NotSerializableException:

用例非常基本。有一个只有协调节点知道并希望在其成员节点之间分配一些工作的单元列表。

基本上我只想用我的 args 远程调用一个方法。就是这样,就是这样,简单明了。

private void processUnit(Unit unit)
{
  Processor.process(unit);
}

public void distributeUnits(List<Unit> units)
{
  for (int i = 0; i < units.size(); ++i)
  {
    Address target = getAddress(i);
    ClusterExecutor executor = getExecutor();
    executor.filterTargets(target).submit((Runnable & Serializable) () -> processUnit(unit);
  }
}

我的目标是让成员节点使用节点上下文(它自己的Processor,这是一个 @Autowired spring @Component)执行 Runnable。

我在这里和那里尝试了不同的方法,例如静态,扩展和/或实现 Runnable、Serializable 等的类。我尝试的最后一件事是使用观察者模式而不是调用处理器来调用静态OBSERVABLE.notifyObservers(unit )(将处理器添加为观察者)。但是我得到了相同的输出,此时它只是反复试验。我没有想法,我将不胜感激有关这方面的一些指导或指导。

标签: javalambdarunnableserializableinfinispan

解决方案


正如@Mudokonman 在他的评论中所写,(Runnable & Serializable)语法是 find,但 lambda 捕获的所有变量Serializable也必须是。这包括thislambda 调用非静态方法时的隐式。

您可以尝试-Dsun.io.serialization.extendedDebugInfo=true准确找出 lambda 的哪一部分不可序列化。


推荐阅读