我使用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的空值的最佳方法是什么。我至少可以想到三个策略:
提前致谢
答案 0 :(得分:0)
至少在更高版本中,当状态提供程序(通常是协调程序)在状态传输期间崩溃时,JChannel.getState()会引发异常。我只是再次调用JChannel.getState(),也许是在一点点睡眠之后,因为这将访问一个不同的状态提供者(新的coord)。