Java запускает службы параллельно на сервере - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть сервис, который обрабатывает запрос от пользователя.

И эта служба вызывает другую внешнюю серверную систему (веб-службы).но мне нужно выполнять эти серверные веб-службы параллельно.Как бы Вы это сделали?Каков наилучший подход?

заранее спасибо

----- edit

Внутренняя система может выполнять запросы параллельно, мы используем контейнеры типа (tomcat дляразвитие) и websphere, наконец, для производства.Так что я уже в одном потоке (сервлет) и мне нужно создать две задачи и, возможно, запустить их параллельно как можно ближе друг к другу.


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

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

Ответ заключается в запуске задач в отдельных потоках.

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

Код будет выглядеть примерно так. (Обратите внимание, что это всего лишь эскиз. Проверьте детали в javadoc, узнайте, что означают цифры и т. Д.)

// Create the executor ... this needs to be shared by the servlet threads.
Executor exec = new ThreadPoolExecutor(1, 10, 120, TimeUnit.SECONDS,
        new ArrayBlockingQueue(100), ThreadPoolExecutor.CallerRunsPolicy);

// Prepare first task
final ArgType someArg = ...
FutureTask<ResultType> task = new FutureTask<ResultType>(
        new Callable<ResultType>() {
            public ResultType call() {
                // Call remote service using information in 'someArg'
                return someResult;
            }
});
exec.execute(task);

// Repeat above for second task
...
exec.execute(task2);

// Wait for results
ResultType res = task.get(30, TimeUnit.SECONDS);
ResultType res2 = task2.get(30, TimeUnit.SECONDS);

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


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

1 голос
/ 11 апреля 2011

Вы можете использовать Threads для параллельного выполнения запросов.

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

0 голосов
/ 11 апреля 2011

Хейко прав, что вы можете использовать темы. Нитки - сложные звери, и с ними нужно обращаться осторожно. Лучшее решение - использовать стандартную библиотеку, такую ​​как java.util.concurrent. Это будет более надежный способ управления параллельными операциями. При таком подходе есть преимущества в производительности, такие как пул потоков. Если вы можете использовать такое решение, это будет рекомендуемый способ.

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

public class Threads {
    public class Task implements Runnable {
        private Object result;
        private String id;

        public Task(String id) {
            this.id = id;
        }

        public Object getResult() {
            return result;
        }

        public void run() {
            System.out.println("run id=" + id);
            try {
                // call web service
                Thread.sleep(10000);
                result = id + " more";
            } catch (InterruptedException e) {
                // TODO do something with the error
                throw new RuntimeException("caught InterruptedException", e);
            }
        }
    }

    public void runInParallel(Runnable runnable1, Runnable runnable2) {
        try {
            Thread t1 = new Thread(runnable1);
            Thread t2 = new Thread(runnable2);

            t1.start();
            t2.start();

            t1.join(30000);
            t2.join(30000);
        } catch (InterruptedException e) {
            // TODO do something nice with exception
            throw new RuntimeException("caught InterruptedException", e);
        }
    }

    public void foo() {
        Task task1 = new Task("1");
        Task task2 = new Task("2");

        runInParallel(task1, task2);

        System.out.println("task1 = " + task1.getResult());
        System.out.println("task2 = " + task2.getResult());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...