Запустить код Java после возврата метода? - PullRequest
3 голосов
/ 14 февраля 2012

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

Чтобы лучше понять, это рабочий процесс:

  1. Вызовите определенную операцию (метод) моего веб-сервиса
  2. Начало обработки
  3. Отправлено подтверждение того, что обработка была начата (это будет возвращаемое значение)
  4. Продолжить обработку

Потоки не работают, так как потоки должны быть прерваны перед возвратом метода.

У кого-нибудь есть идея, как реализовать этот сценарий или альтернативу ему?

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 14 февраля 2012

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

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

public Acknowledgement someService() {
  new Thread(new SomeServiceRunnable()).start();
  return new Acknowledgement();
}

Служба будет запущена, затем метод вернется (таким образом, уведомив, что процесс запущен), пока обработка продолжается до завершения потока ...

Я что-то упускаю здесь из-за того, что вам нужно достичь?

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

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

Это для ситуации, когда вы хотите толькопризнать, что сервис концептуально начал выполнение.Подтверждение может не дать никакой информации об успешности какой-либо части этого выполнения или его инициализации, только о том, что он концептуально запущен, то есть, что Associated Runnables run () будет вызван в некоторый момент.

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

2 голосов
/ 14 февраля 2012

Как насчет вызова метода обратного вызова для клиента. Смотрите рабочий процесс

  1. Вызовите определенную операцию (метод) моего веб-сервиса
  2. Начало обработки
  3. Вызовите метод на клиенте, отправив подтверждение.
  4. Продолжить обработку
1 голос
/ 14 февраля 2012

Потоки не работают, так как потоки должны быть прерваны до возврата метода.

Неверно.Потоки совместно используют переменные и, таким образом, могут обмениваться данными между потоками без необходимости возврата из потока.Возьмем ваш пример:

Вызов определенной операции (метода) моего веб-сервиса

Создать новую ветку для этого

Отправлено подтверждениечто обработка была начата (это будет возвращаемое значение)

Нет, не делайте это по возвращаемому значению.Новый поток отправляет сообщение в любой класс, который вы хотите (вызывает метод, изменяет переменную ...).С этим вы можете сигнализировать все, что вы хотите, в любой поток, который вы хотите.Просто остерегайтесь гоночных условий и при необходимости используйте ключевое слово «synchronized»!

Продолжить обработку

Новый поток продолжает обрабатываться, как и основной поток.

0 голосов
/ 14 февраля 2012

Ответом на вашу проблему является создание потока:

public boolean beginWorkAndSendAck(){
    Thread t = new Thread(){ 
        public void run(){
            //Do something here
        }
    }
    t.start();
    return true;
}

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

Если он не работает, возможно, веб-служба выполняет какое-то вуду -закрытие процесса Java или что-то подобное.Я бы посоветовал взглянуть на создание нового процесса с использованием Java здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html, для выполнения которого вам потребуется отдельное приложение.

0 голосов
/ 14 февраля 2012

Возможно, вы ищете асинхронный вызов веб-службы:

http://today.java.net/pub/a/today/2006/09/19/asynchronous-jax-ws-web-services.html

...