Как исправить 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 раз, но код приложения динамически перезапускается.

Другие вопросы по тегам