Как использовать сообщение без пересылки на остальную часть конвейера

У меня есть обработчик на моем сервере, который ищет конкретный экземпляр входящего сообщения, и когда он приходит, обработчик устанавливает внутренний атрибут. Поскольку мне больше не нужно входящее сообщение, я не хочу отправлять его вверх по течению остальной части конвейера, поэтому я просто возвращаюсь из метода messageReceived().

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    if (e.getMessage() instanceof StartTimerCommand) {
        trigger.getAndSet(true);
        return;
    }

    ctx.sendUpstream(e);
}

Похоже, это приводит к блокировке моего конвейера, поскольку от клиента больше не поступают сообщения. Как удалить нежелательные сообщения, если они мне больше не нужны?

С уважением


person user497087    schedule 07.12.2011    source источник
comment
Я не вижу никаких проблем с вашим кодом. Возможно, что-то еще не так?   -  person trustin    schedule 07.12.2011
comment
Рассматриваемый обработчик является номером 6 в конвейере из 9 обработчиков. При использовании обработчика, указанного выше, после получения команды StartTimerCommand больше не обрабатываются сообщения. Если я удалю обработчики возврата и изменю 7,8 и 9, чтобы они также обрабатывали StartTimerCommand, тогда все будет работать так, как ожидалось.   -  person user497087    schedule 07.12.2011
comment
Вы уверены, что сообщения, которые вы получили после первого StartTimerCommand, не являются StartTimerCommand? Было бы здорово, если бы вы помогли нам воспроизвести проблему, предоставив небольшой образец приложения и зарегистрировав проблему в нашем трекере проблем.   -  person trustin    schedule 08.12.2011


Ответы (2)


Когда вы переопределяете метод получения сообщения, вы берете на себя ответственность за пересылку сообщения в цепочке. Поэтому, если вы не сделаете это явно, ваше сообщение будет использовано.

Всякий раз, когда вам нужно переслать ваше сообщение, звоните:

super.messageReceived(ctx, e)

В противном случае сообщение не будет переадресовано, чего вы и хотите.

person yerlilbilgin    schedule 03.09.2012

попробуй это:

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    if (e.getMessage() instanceof StartTimerCommand) {
         trigger.getAndSet(true);
    }
    else {
        ctx.sendUpstream(e);
    }
}

Использование «return» в методах void выглядит ИМХО странно/запутанно

person Felix Husse    schedule 05.01.2012
comment
Судя по описаниям, механизм четной обработки вышел из строя и перестает обрабатывать события. Предложенное вами изменение выглядит функционально эквивалентным. Решит ли это изменение кода проблему автора? - person ahoffer; 05.01.2012
comment
Этот ответ бесполезен для вопроса. - person Vincent Cantin; 01.04.2012