Java: не работает ли SelectionKey.attach ()? - PullRequest
3 голосов
/ 21 августа 2009

В моей реализации Java NIO я не смог заставить SelectionKey.attach () работать. По сути, как только клиенты подключаются (OP_ACCEPT интерес операций), я добавляю их на карту, где их IP-адрес отображается на объект, который поддерживает состояние для клиента. Затем, когда происходит OP_READ, я снова получаю IP-адрес клиента, и на этот раз получаю значение из карты и таким образом получаю объект состояния клиента.

Проблема здесь в том, что я должен выполнять поиск карт КАЖДЫЙ РАЗ, когда данные считываются из сети. Там много потраченной впустую работы. Итак, я был рад видеть, что вы можете прикрепить произвольный тип объекта к SelectionKey, который должен быть легко извлечен при вызове SelectionKey.attachment (), даже если мы сейчас обрабатываем другое событие (полученное во время OP_READ по сравнению с помещенным в карта во время OP_ACCEPT).

Проблема в том, что это не работает. Когда я получаю вложение, оно всегда равно нулю. И если я установлю вложение с помощью attach (), а затем сразу же вызову attachment (), это сработает. Как-то между разными событиями он теряет связь.

Извините, мой код немного длинный для публикации здесь, но если вы посмотрите на комментарии в этой теме: текст ссылки ... Вы увидите, что некоторые другие в основном пришли к одному и тому же выводу: что attach () и attachment () не работают и никогда не работают.

Есть ли хитрость, чтобы заставить его работать, или я застрял со злыми накладными расходами, необходимыми для ручного поиска на карте КАЖДЫЙ ВРЕМЯ, когда есть новое событие чтения для обработки?

Наконец, есть ли способ "обернуть" SelectionKey в новый подкласс, который будет правильно обрабатывать attach () и attachment ()?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 21 августа 2009

Я успешно прикрепил объекты к SelectionKeys без каких-либо проблем, но только из того же события. Например, в первый раз, когда я получаю OP_READ, я присоединяю объект к SelectionKey и при последующих чтениях извлекаю его, и он отлично работает. Возможно, OP_ACCEPT и OP_READ обрабатывают разные ключи, потому что это разные события, но я думаю, что SelectionKey должен быть одинаковым для одного и того же соединения ... однако, если вы делаете разные соединения даже с одного и того же IP, вы получите разные SelectionKeys .

ОБНОВЛЕНИЕ: я только что проверил свой код, и есть кое-что очень важное: я вообще не вызывал attach (); Я использовал SelectableChannel.register(Selector sel, int ops, Object att) метод. Если вы это сделаете, последующие вызовы attachment () для SelectionKey будут работать.

1 голос
/ 21 августа 2009

На вашей связанной странице нет CR, и я ничего не вижу на bugs.sun.com . Тем не менее, attach / attachment - очень простой код (хотя он немного сложнее после моей ошибки . Я предполагаю, что вы получаете другой SelectionKey, поэтому пытаться обернуть его было бы бессмысленно.

...