2012-01-06 2 views
0

Кто-нибудь есть простой пример кода, показывающий, как Нетти 3.2.7 должен правильно обработать запрос SQL в следующем сценарии:Правильный способ ждать SQL ввода/вывода для завершения

Способ вызова передает сообщение сервер messageReceived метод. Метод messageRecieved выполняет запрос sql и получает результат . Вызывающий метод не должен продолжать обрабатывать до тех пор, пока он не получит результат запроса sql .

В частности, пример того, как netty ждет завершения ввода-вывода (sql-запрос), будет очень полезен.

ответ

0

Вам нужно добавить ExecutionHandler перед вашим обработчиком, который выполняет запрос sql. Вот это ...

В противном случае вы будете блокировать ваш работник-нить

+0

Спасибо за ответ. Однако он не отвечает на вопрос о , как netty правильно ожидает результат от sql и возвращает его вызывающему методу. В противном случае метод вызова продолжается до того, как он получит результат от sql (и для правильного выполнения результата он должен получить результат). – Ray

+0

Я думаю, что он отвечает на вопрос, поскольку другие «обработчики» за вашим обработчиком, которые вызывают sql, будут выполняться только после завершения кода sql. Поэтому я думаю, что его то, что вы хотите, или я пропустил, поняли? Отъезд: http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/execution/ExecutionHandler.html –

0

Norman спасибо за дополнительную информацию. Я думаю, что это может решить проблему, но это связано с добавлением дополнительного обработчика, который на самом деле не требуется, и будет добавлен исключительно для обеспечения завершения SQL-запроса (без каких-либо функций).

Я искал «более стандартный» способ и нашел ссылку «http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelFuture.html», в котором говорится: Предоставляются различные методы, позволяющие вам проверить, завершена ли операция ввода-вывода, дождаться завершения и получить результат операции ввода-вывода, а также позволяет добавлять ChannelFutureListeners, чтобы вы могли получать уведомления, когда I/O завершена .... »

Он также говорит, что предпочитает addListener (ChannelFutureListener) ждать(), но я не знаю, как это реализовать. Если кто-нибудь знает, как реализовать это, чтобы дождаться завершения запроса sql-запроса i/o, это было бы очень полезно.

Чтобы решить этот вопрос в методе SendMessage я использовал

lastWriteFuture = connector.write(message); 
if (lastWriteFuture != null) { 
     lastWriteFuture.awaitUninterruptibly(); 
} 

Это работает - он ждет запроса SQL для завершения, а затем Retuns к абоненту.

+0

Ах да, это работает .. Я думал, вы хотите подождать sql чтобы быть полным изнутри нити. В потоке io вы не можете вызвать wait *(), поскольку он будет блокироваться. –

Смежные вопросы