jgroups中的setState(null)

时间:2015-08-27 07:03:45

标签: jgroups

我使用jgroups 2.12.1在应用程序的不同实例之间保持同步会话表。

我使用默认的UDP配置。

这是SessionTable类的摘录,它实现了MessageListener接口(等等)。

@Override
public byte[] getState() {
    try {
        synchronized(this) {
            return Util.objectToByteBuffer(idMap);
        }
    } catch (Exception e) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("Exception in getState()", e);
        }
        return null;
    }
}

@Override
@SuppressWarnings("unchecked")
public void setState(byte[] bytes) {
    try {
        synchronized(this) {
            idMap = (Map<Long,SessionDescriptor>)Util.objectFromByteBuffer(bytes);
            userMap.clear();
            for (SessionDescriptor desc: idMap.values()) {
                userMap.put(desc.getUser(), desc);
            }
        }
        LOG.info("Session table retrieved from group: "
                + idMap.size() + " sessions " + bytes.length + " bytes");
    } catch (Exception e) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("Exception in setState()", e);
        }
    }
}

我最近发现在某些情况下,使用null参数广播setState:

....jgroups.protocols.pbcast.STATE_TRANSFER;discovered that the state provider (radius-ext-gv2-39388) crashed; will return null state to application

我已经工作了6年或7年没有问题,本月两次会话表被设置为空,导致NPE到处都是。

所以我想知道处理传递给setState的空值的最佳方法是什么。我至少可以想到三个策略:

  1. 保持表格不变,
  2. 重置表格,
  3. 设置一个标志,下次使用非null参数调用setState时,合并这两个表。
  4. 提前致谢

1 个答案:

答案 0 :(得分:0)

至少在更高版本中,当状态提供程序(通常是协调程序)在状态传输期间崩溃时,JChannel.getState()会引发异常。我只是再次调用JChannel.getState(),也许是在一点点睡眠之后,因为这将访问一个不同的状态提供者(新的coord)。