0

是否可以“取消定义” Netty AttributeKey 或 UniqueName 实例?

我在 OSGi 容器中部署了 Netty 4.0.8,并且我在单独的包中有一个类,它定义了一个static final AttributeKey.

问题是重新加载或重新部署该捆绑包会导致该类再次加载(并且静态初始化再次发生),因此AttributeKey构造函数调用会爆炸,因为用于标识它的字符串已经存在于使用中名称的映射中捆绑包上次启动的时间。

在构造函数的参数末尾附加一个随机数String可以避免冲突,但这会导致名称在AttributeKey类的UniqueName映射中累积。

AttributeKey然后我的问题是关于在可以动态重新加载的类中定义 s 的最佳实践。具体来说:它是什么?我需要管理自己的AttributeKey实例池吗?

作为参考,丑陋的随机数黑客看起来像这样:

private static final AttributeKey<ChannelGroup> PAGE_GROUP = 
        new AttributeKey<>("MyOtherwiseUniqueString" + new Random().nextInt());
4

1 回答 1

0

已为 Netty 5 安排了此错误的修复。现在您必须使用工厂方法而不是构造函数来获取AttributeKey

private static final AttributeKey<Boolean> KEY =
        AttributeKey.valueOf(MyHandler.class, "MY_KEY");

它总是返回一个单例,所以你不必再担心类加载器问题了。有关更多信息,请阅读此拉取请求

于 2013-10-25T11:40:47.370 回答