BinaryObjectException:无法找到具有紧凑页脚的对象的架构

时间:2016-05-24 10:26:44

标签: java caching ignite

这是一个场景:我将我的Web应用程序部署到两个Tomcat服务器,并使用Apache Ignite来集群Web会话。负载均衡器以循环方式进行。

我使用的软件是:

  • JDK 1.8.0_66
  • Apache Tomcat 7.0.68
  • Apache Ignite 1.6.0
  • Crossroads负载均衡器版本2.65

以下是我在会话中输入的数据:

import java.io.Serializable;

public class SessionData implements Serializable {
    private static final long serialVersionUID = 1L;
    private int counter;

    public int getCounter() {
        return counter;
    }
    public void setCounter(int counter) {
        this.counter = counter;
    }

    public SessionData() {
    }
}

我可以验证两个应用程序是否共享相同的数据,一切都运行良好。

然后我将会话数据类更新为:

public class SessionData implements Serializable {
    private static final long serialVersionUID = 1L;
    private int counter;
    private String ip;

    public int getCounter() {
        return counter;
    }
    public void setCounter(int counter) {
        this.counter = counter;
    }

    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }

    public SessionData() {
    }
}

我将新的Web应用程序部署到其中一台服务器上。现在,当我刷新网页时,会反过来读取和更新会话数据中的计数器,我不断从两台服务器收到以下错误,页面永远不会加载。

ERROR - root                       - Failed to update web session: null
class org.apache.ignite.binary.BinaryObjectException: Cannot find schema for object with compact footer [typeId=-2056860774, schemaId=1954049593]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.getOrCreateSchema(BinaryReaderExImpl.java:1721)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>(BinaryReaderExImpl.java:278)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>(BinaryReaderExImpl.java:177)
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>(BinaryReaderExImpl.java:156)
        at org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:298)
        at org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal(BinaryMarshaller.java:109)
        at org.apache.ignite.cache.websession.WebSessionV2.unmarshal(WebSessionV2.java:336)
        at org.apache.ignite.cache.websession.WebSessionV2.getAttribute(WebSessionV2.java:200)

我相信这是一个常见的情感。想象一下,集群中有几十个节点,我们需要一个接一个地将更新版本的Web应用程序重新部署到所有节点。在重新部署过程中,这个问题将浮出水面,用户将会受到影响。

不知道这是Apache Ignite的真正问题,还是由于我的错误配置/误解?如果有问题,有没有解决方法?或者我必须在最坏的情况下关闭所有服务器;如果我们使用持久存储,我们是否需要清除持久存储中的所有数据?

1 个答案:

答案 0 :(得分:1)

我不确定原因,但这看起来不正确。创建了一张票:https://issues.apache.org/jira/browse/IGNITE-3194

作为一种解决方法,您可以尝试禁用紧凑的页脚。为此,请向您添加以下内容:Ignite configuration:

<property name="binaryConfiguration">
    <bean class="org.apache.ignite.configuration.BinaryConfiguration">
        <property name="compactFooter" value="false"/>
    </bean>
</property>