2012-03-01 1 views
0

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

Я думал о том, чтобы хранить ссылку на декодер, совместно используемый всеми конвейерами, и перенастраивать его снаружи по мере необходимости. В этом случае я беспокоюсь о параллелизме.

  • Как я могу убедиться, что ни одна запись не обрабатывается конвейером, а Я работаю над декодером?
  • и как быть уверенным, что уведомление - это первое сообщение, обработанное после реконфигурации?

Единственный другой способ, по которому я вижу, - отправить объект уведомления через конвейер (используя channel.write), поймать объект в декодере и выполнить перенастройку, а затем переадресовывать сообщение уведомления. В этом случае не должно быть параллелизма в конвейере.

  • будет ли это лучшим/современным способом сделать это?

ответ

0

Я решил использовать второй способ. StateHandler ловит ConfigurationEvents переконфигурирует конвейер. К сожалению, это означает, что я не могу быть уверенным, что все каналы используют одну и ту же конфигурацию, потому что могут возникать условия гонки между реконфигурацией и чрезвычайно молодыми каналами. но я уверен, что это не имеет значения в моем случае.