如何禁用 Wildfly 9.0.2 尝试序列化集群应用程序中的某些类

Posted

技术标签:

【中文标题】如何禁用 Wildfly 9.0.2 尝试序列化集群应用程序中的某些类【英文标题】:How to disable Wildfly 9.0.2 trying to serialize certain classes in a clustered application 【发布时间】:2016-05-05 19:03:54 【问题描述】:

在设置集群期间,我遇到了 WildFly/Infinispan 尝试序列化多个类的问题,这些类可以在每个实例上重新创建 - 尽管无论出于何种原因,它们似乎都决定在集群中分布。

最初我认为@Stateless 注解会产生我想要的效果,尽管它会因为没有正确的构造函数而引发问题,所以我不相信这是我们正在寻找的。​​p>

在每个类的基础上禁用此功能或覆盖序列化方法的正确方法是什么?

【问题讨论】:

您所说的“可以保持完全状态”是什么意思?此外,放置@Stateful 会将类转换为有状态的 EJB,然后自动分布在集群中以提供容错。 你是对的,我一直使用错误的注释,我现在再试一次> 我的措辞不正确,我的意思是我不希望它聚集 - 我希望每个实例都有自己的版本。 您应该可以使用 @Stateless@Singleton 来实现这一点,但在这种情况下,您需要向您的类添加一个无参数的构造函数。 好的,谢谢你说得有道理。我将开始进行一些重写以摆脱构造函数。我会报告进度 没有可衡量的效果 - 它仍在尝试使用 @Stateless 注释序列化市场。 【参考方案1】:

没有答案

注意禁用所选类的序列化方法。 当在本地或在某些有限的开发环境中运行时,您的应用程序可能不需要“集群”并且不需要复制会话或有状态实体。但是,一旦部署到测试或生产环境,它就可以集群化。如果您阻止了序列化,那么它将被破坏。

因此,采取行动的最佳原因是确保类的“可序列化”,而不是强制阻止它。

序列化关闭答案

如果您坚持禁用序列化,从您的 web.xml 中删除 <distributable/> 应该可以解决问题。

序列化不可序列化的答案

通过尝试使某些类可序列化,有时您会发现某些类成员的类型根本是不可序列化的,并且您无法将类型交换为类似的东西,这会序列化。 然后使用以下技巧,前提是它适用:

public class ClassForcedToBeSerializable implements Serializable 

    transient private FileWriter writer; //FileWriter is not serializable!!!
    private final File file;

    public ClassForcedToBeSerializable(File file) throws IOException 
        this.file = file;
        this.writer = new FileWriter(file);
    

    //FLESH AND BONES HERE

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException 
        in.defaultReadObject();
        if (writer == null) 
            this.writer = new FileWriter(file);
        
    

如您所见,该类包含FileWriter 类型的字段。我们通过将其标记为transient 来确保对象-> 字节序列化。但是,在远程 JVM 上,当此类从字节中恢复时,您的 FileWriter 字段字段将为 null。我们通过在反序列化期间重新创建它来避免这个问题(参见readObject() 方法)。

此示例之所以有效,是因为 File 字段包含足够的状态,以便成功重新创建 FileWriter

【讨论】:

以上是关于如何禁用 Wildfly 9.0.2 尝试序列化集群应用程序中的某些类的主要内容,如果未能解决你的问题,请参考以下文章

WildFly 9.0.1 WFLYCTL0158 处理程序“控制台”未找到

如何在 WildFly 上禁用 WELD

Wildfly 9.0.2-Struts 1.x 的最终 ClassNotFoundException

如何在Wildfly 8.2.0中的server.log文件中禁用日志记录应用程序日志

如何从 Wildfly 中删除 KeyCloak?

如何让 Wildfly 10 / Resteasy 向客户端指示序列化异常