Реализовать синхронный сетевой вызов в Java, ожидая подтверждения? - PullRequest
0 голосов
/ 20 мая 2009

Как бы вы реализовали эквивалентный метод ожидания вызова метода в Java?

По сути, я хочу использовать метод, который отправляет сообщение по сети серверному приложению и ожидает, пока оно не получит соответствующее сообщение Ack с сервера либо с успешным завершением операции, либо с ошибкой операции и сообщением об ошибке.

У меня уже есть неблокирующая версия моего метода, которая передает класс обратного вызова, в котором есть метод, который вызывается при обратном вызове.

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

Ответы [ 4 ]

2 голосов
/ 20 мая 2009

Добавление .wait () к вашему классу обратного вызова было бы самым простым путем. Он может вращаться на каком-то флаге, пока ваш обратный вызов не переключит его, просто обязательно включите Thread.yield () или .sleep () в ваш цикл.

Сохраняет необходимость перезаписи альтернативного канала блокировки.

1 голос
/ 20 мая 2009

Да, используйте ваш существующий метод, как вы предлагаете. Создайте обратный вызов в вызове метода синхронизации, который будет координироваться с вызовом метода синхронизации через wait () / notify () Метод sync вызовет асинхронный метод, а затем wait (). Когда вызывается обратный вызов, он вызывает notify (), чтобы активировать метод синхронизации, чтобы он мог вернуть результаты.

1 голос
/ 20 мая 2009

Краткий ответ: Да. Я фанат использования того, что уже есть в библиотеке классов, то, что вы описываете, очень похоже на шаблон Observer, для которого у вас уже есть интерфейсы Observer / Observable, если вы используете J2SE.

РЕДАКТИРОВАТЬ: Что-то не так с моим кофе :) Очевидно, что я хотел сказать, чтобы проверить, что находится в пакете java.util.concurrent, в частности классы Future <> и ExecutorService.

0 голосов
/ 20 мая 2009

Пожалуйста, игнорируйте, если вы не используете JMS.

Если вы используете JMS, то вы можете использовать QueueRequestor , который является реализацией шаблона ответа на запрос .

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

QueueRequestor requestor = null;
try {
    requestor = new QueueRequestor(session, queue); 
    Message response = requestor.send(request);
} finally {
    if (requestor == null) {
        try {
            requestor.close();
        } catch (JMSException e) {
            // log error message
        }
     }
}
...