Как исправить AttributeKey, приводящую к IllegalArgumentException в Netty 4
Я портирую приложение Netty 3 на Netty 4. Приложение Netty 3 использует
Attachement
прикреплять объекты к контексту.
Читая Новое и заслуживающее внимания в 4.0, я вижу, что Attachment был удален и заменен AttributeKey / AttributeMap.
Проблема в том, что это работает, когда я запускаю приложение, но при интеграционном тестировании я получаю сообщение об ошибке:
Caused by: java.lang.IllegalArgumentException: 'attr_key' is already in use
Где
attr_key
определен в совместно используемом обработчике:
private final AttributeKey<Object> ATTR_KEY = AttributeKey.newInstance("attr_key");
а затем используется где-то еще в том же классе обработчика следующим образом:
channel.attr(ATTR_KEY).set(new Object())
Любые идеи или мысли о рекомендуемом способе использования AttributeKey / AttributeMap для предотвращения этой ошибки? Спасибо!
1 ответ
При использовании ключей атрибутов убедитесь, что вы построили их только 1 раз.
Это означает, что вам нужно хранить их внутри
private static final
переменная, a
private final
переменная недостаточно хороша, так как она дает ошибку, когда класс создается несколько раз.
Если невозможно убедиться, что метод
newInstance
метод вызывается однократно, вам нужно использовать
AttributeKey.valueOf
, поэтому он отключает обнаружение конфликтов. Это требуется для некоторой среды модульного тестирования, где библиотеки загружаются 1 раз, но код приложения динамически перезапускается.