Java: асинхронная задача - PullRequest
2 голосов
/ 18 мая 2010

Для некоторых HTTP-запросов от клиентов существует очень сложная бизнес-логика на стороне сервера. Некоторые из этих бизнес-логик не требуют немедленного ответа клиенту, как, например, отправка электронного письма кому-либо. Могу ли я поместить эти задачи в асинхронный метод, поэтому мне нужно только убедиться, что они были выполнены, мне не нужно ждать завершения всех задач, чтобы ответить пользователю.

Обновлено: некоторые люди спрашивали о фреймворке, который я использую. Я использую Struts2 + Spring.

Ответы [ 9 ]

2 голосов
/ 18 мая 2010

Вы можете использовать следующую схему «огонь и забыть»:

new Thread(new Runnable(){
    public void run(){
        System.out.println("I Am Sending Email");
        sendEmailFunction();
    }
}).start();

Но слишком много таких нитей приведет к неприятностям. Если вы собираетесь это сделать, то вам следует использовать ThreadPoolExecutor, чтобы обеспечить некоторый контроль над производством потоков. Как минимум, поместите максимум в число потоков.

0 голосов
/ 18 мая 2010

Spring имеет хорошую поддержку для планирования Quartz, а также Java Threading. Эта ссылка даст вам лучшее представление об этом.

0 голосов
/ 18 мая 2010

Да, вы можете Servlet 3.0 имеет отличную асинхронную поддержку.

Смотреть это это действительно отличный ресурс, вы можете смотреть весь актерский состав, если вы не знакомы с Servlet 3.0.

Хороший путь вниз здесь .

api docs .

0 голосов
/ 18 мая 2010

Можно ли поместить эти задачи в асинхронный метод, чтобы мне не нужно было ждать завершения всех задач, чтобы ответить пользователю?

YES

0 голосов
/ 18 мая 2010

Вы должны немедленно ответить на все запросы HTTP, в противном случае клиент может подумать, что сервер не отвечает или истекло время ожидания. Однако вы можете запустить другие потоки или процессы для выполнения задач в фоновом режиме, прежде чем отвечать клиенту.

Вы также можете продолжать отправлять 100 ответов, пока задача не будет завершена.

0 голосов
/ 18 мая 2010

Вы хотите посмотреть на java.util.concurrent.Executors. Одним из способов решения вашей проблемы является наличие ScheduledExecutorService, который хранит очередь и выполняется так часто. Существует множество различных способов разгрузки работы, доступных в параллельных утилитах, однако это зависит от ваших требований, насколько дорогостоящие задачи, насколько быстро их нужно выполнять и т. Д.

0 голосов
/ 18 мая 2010

в java нет "асинхронного метода", но вы будете либо использовать Threads (возможно, через каркас, например, Quartz: http://www.quartz -scheduler.org / ), либо очередь сообщений, например, JMS * 1004. *http://java.sun.com/products/jms/

0 голосов
/ 18 мая 2010

Я не знаю, какой фреймворк вы используете, но в базовой Java вы можете просто создать новый поток:

interface MyTaskCallback {
    void myTaskCallback();
}
class MyTask implements Runnable {  
    MyTaskCallback callback;
    Thread me;
    public MyTask(MyTaskCallback callback) {
        this.callback = callback;
        this.me = new Thread();
    }

    public void start() {
        this.me = new Thread(this);
        this.me.start();
    }

    public void stop() {
        try {
            this.me.join(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        // Calls here will not block the other threads
        sendEmailRequest();
        callback.myTaskCallback();
    }
}

class Main implements MyTaskCallback {
    public void foo() {
        MyTask m = new MyTask(this);
        m.start();
    }

    public void myTaskCallback() {
        // called when MyTask completes
    }
}
0 голосов
/ 18 мая 2010

Да. Читать о параллелизме .

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

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