Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > паралельный запуск


Автор: sergioK1 13.9.2015, 15:12
Имеется sрring conroller 


Код

 @RequestMapping("/matlab")
    public Object startMатab(Active  game) {


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

Автор: CPlusPlusFAN 13.9.2015, 18:02
Вернуть из контроллера Future?

Автор: Samotnik 13.9.2015, 20:27
Как вариант: В контролере создавай новый поток или сколько тебе нужно. Передавай туда объекты и спокойно обрабатывай. Создай второй контроллер, который будет возвращать результат по некому "айди запроса" который ты сам можешь генерировать.

Добавлено через 1 минуту и 36 секунд
т.е. фактически первый контроллер возвращает айди запроса, он берет объекты на обработку, а некий веб сервис типо getResult будет тебе по айди запроса возвращать результат и статус. 

Автор: d_k 14.9.2015, 08:14
нехорошо на вебе порождать потоки самому. Через механизм очередей и фоновый обработчик было бы интереснее

Автор: Samotnik 14.9.2015, 08:42
d_k,  smile Значит http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html был придуман просто так?

Автор: d_k 14.9.2015, 10:18
Судя по RequestMapping - используется спринг, спека EE не при чем. Хотя даже в ее рамках ИМХО, порождать потоки которые не управляются контейнером - не айс. Ранее сан еще предостерегал разработчиков от порождения потоков на уровне EJB, сейчас дали послабление через конкарренси апи, а толку то? попытка угнаться за тем же самым спрингом?

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

ЗЫ: спека спекой, но под конкретную задачу - конкретный рецепт. панацеи нет)))
ЗЗЫ: холиварить не собирался, просто высказал свое мнение

Автор: leniviy 14.9.2015, 11:24
А нельзя использовать аякс? Пусть сервлет выполняется синхронно.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/paralelny-zapusk-id55f568c9ae20155b408b4567#findElement_E7045_55f68439ae20157b1e7f5d57_0

Автор: mailer 14.9.2015, 11:32
http://spring-projects.ru/guides/async-method/ как это делается в Спринге

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/paralelny-zapusk-id55f568c9ae20155b408b4567#findElement_E7045_55f68610ae2015831e7f5e38_0

Автор: Samotnik 14.9.2015, 13:36
d_k, спринг конечно крут, но я дал ссылку на Java, потому что это всё таки Java smile А не фрэймворк (хоть и один из мощнейших в мире) И если отцы основатели так сказали делать, значит это делать можно. Опять же, пример привел из своей практики, буквально пол года назад на веб приложении, на рест сервисах, делал многопоточную обратбоку. Полгода работает - норм. Вообще, во всех больших ВЕБ приложения я видел многопоточность. При разумном использовании (обрабатывать кол-во потоков и кол-во памяти, дабы не положить сервак), всё очень даже работоспособно. Не знаю на чем http://www.aviasales.ru/ написанно, предположим на Жаве, слать запросы на сотни продавцов в одном потоке глупо, юзер ждал бы результаты минут пять.
Полностью согласен с 
Цитата(d_k @  14.9.2015,  10:18 Найти цитируемый пост)
спека спекой, но под конкретную задачу - конкретный рецепт. панацеи нет)))

Задача размана изначально, поэтому предложил из опыта. Будут детали вопроса, можно думать дальше. 

Автор: CPlusPlusFAN 14.9.2015, 20:11
Цитата(mailer @  14.9.2015,  11:32 Найти цитируемый пост)
Вот как это делается в Спринге

Ну я это с самого начала предложил. Спринг умеет это делать - пускай делает.

Автор: sergioK1 17.9.2015, 22:50
Цитата(Samotnik @ 14.9.2015,  12:36)
d_k, спринг конечно крут, но я дал ссылку на Java, потому что это всё таки Java smile А не фрэймворк (хоть и один из мощнейших в мире) И если отцы основатели так сказали делать, значит это делать можно. Опять же, пример привел из своей практики, буквально пол года назад на веб приложении, на рест сервисах, делал многопоточную обратбоку. Полгода работает - норм. Вообще, во всех больших ВЕБ приложения я видел многопоточность. При разумном использовании (обрабатывать кол-во потоков и кол-во памяти, дабы не положить сервак), всё очень даже работоспособно.

Cпринг применяют там где есть аспекты, тут аспектов нет,
ты делаешь так ?
Код

 Runnable myRunnable = new Runnable(){

     public void run(){
        System.out.println("Runnable running");
     }
   }


или его разновидности ? 
d_k видимо имеет ввиду пользовать конфигурацию томката через 
JNDI. Я пока не могу найти пример как жто сделать .

Автор: sergioK1 16.4.2016, 15:38
Цитата(Samotnik @ 14.9.2015,  12:36)
Задача размана изначально, поэтому предложил из опыта. Будут детали вопроса, можно думать дальше.

задача проста как три копейки  smile 
Все что нужно это отсылать данные клиенту каждые пару секунд,
Сервис с обращением к бд сделать в потоке не проблема 

проблема в том что есть контолер , 
Код

@RequestMapping("/getGames")
        public String hello(int eventId) {
        Games[] games=  scannerService.getGames(eventId);
        Data string = ConverToJson(games);
            return "result";
    }


нужно из него возвращать результат каждые 3-5секунд тоесть 
но response больше одного раза отправить нельзя , 
можно переделать на WebSockets но мне лень менять код клиента , как это переделать с минимумом лишних телодвижений ? 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)