Как я могу получить немедленный ответ от длительного процесса в j2ee? - PullRequest
0 голосов
/ 29 сентября 2011

Кажется, я нигде не могу найти надежного ответа.Я думаю, я нашел один по отношению к JMS, но это сбило с толку.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Это действительно зависит от того, какой стек j2EE вы используете? Это просто web, ejb layer или оба? Если мы говорим об Интернете, то вы можете использовать асинхронный сервлет, представленный в новейшей спецификации Java EE, если вы используете простые EJB-компоненты, то естественным выбором будут бины, управляемые Messege (упоминается JMS). Конечно, вы можете разработать собственное решение, в котором, например, вы отправляете некоторые данные для обработки, а затем само приложение j2ee вызывает ваше приложение (например, с запросом http), чтобы уведомить о завершении работы. Возможности бесконечны, и если один лучше, чем другие, всегда зависит от конкретного сценария.

0 голосов
/ 30 сентября 2011

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

public class DoSillyCounting extends Thread {
    private volatile int counter;
    public int getCounter() { return counter; }
    public run() {
        while (counter < 10) {
            counter ++;
            try { Thread.sleep(1000); }
            catch (InterruptedException ie) { }
        }
    }
}

На вашей странице настройки вы можете сделать это: (сессия - HttpSession)

DoSillyCounting doSillyCounting = new DoSillyCounting();
doSillyCounting.start();
session.putValue("tenSecondsCounter", doSillyCounting);
/* Here you can respond to the user while the Thread is executing */

И на своей странице статуса вы можете сделать следующее:

DoSillyCounting doSillyCounting =
    (DoSillyCounting)session.getValue("tenSecondsCounter");
out.print(Integer.toString(doSillyCounting.getCounter());
if (doSillyCounting.isAlive()) {
    out.print("Still Working on it");
} else {
    out.print("Yippee, I finished");
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...