Nano Hash - криптовалюты, майнинг, программирование

Как запустить процесс в фоновом режиме и перенаправить страницу jsp

Я использую JSP и сервлеты. На одной из моих jsp-страниц я вызову файл .sh, который будет выполняться в течение 2-3 минут, а после завершения процесса он будет перенаправлен на другую jsp-страницу. Моя проблема в том, что пользователю приходится ждать 2-3 минуты, а затем после завершения процесса только он перенаправляется на следующую страницу. Я не хочу, чтобы это произошло, я хочу запустить этот процесс, который должен работать в фоновом режиме, и я хочу, чтобы страница была немедленно перенаправлена.

страница процесса.jsp

FileWriter fileWriter = new FileWriter(file3,true);
BufferedWriter bufferFileWriter  = new BufferedWriter(fileWriter);
fileWriter.append(userid+"\t"+movie_id[i]+"\t"+ratings[i]);
fileWriter.append('\n');
bufferFileWriter.close();

Process p=Runtime.getRuntime().exec("/home/yoganandhd/project.sh");
p.waitFor();

response.sendRedirect("login.jsp");

В приведенном выше коде для выполнения project.sh потребуется 3 минуты, когда он выполнит некоторый процесс сбора данных, а затем только он будет перенаправлен на страницу login.jsp. Мое требование: пользователь не может ждать 3 минуты, он должен быть немедленно перенаправлен на следующую страницу, запустив project.sh в фоновом режиме.

Я новичок, я мало знаю о java, может ли кто-нибудь сказать, как я могу этого добиться? Могу ли я добиться этого с помощью потока? Если да, то как? Кто-нибудь, пожалуйста, объясните мне пример того же сценария.


  • подумайте об использовании веб-сокета для получения уведомления, когда ваш поток будет выполнен. Также избегайте кода в jsp, вместо этого используйте сервлеты. 17.06.2014
  • Согласен @ScaryWombat. Кроме того, это не очень удобно. Никто не ждет 3 минуты, пока страница загрузится. Рассмотрим страницу прогресса с обновлениями AJAX. 17.06.2014
  • @ScaryWombat Большое спасибо, я последую вашему совету и буду использовать сервлеты. Можете ли вы привести небольшой пример того, как использовать веб-сокет для получения. 17.06.2014
  • @NickJ Спасибо за вашу ценную идею. Я новичок в java, и у меня есть базовые знания в java. Можете ли вы предложить или привести пример того, как использовать AJAX для моей проблемы. 17.06.2014

Ответы:


1

Вы можете создать новый поток и выполнить сценарий оболочки отдельно.

public class MyThread extends Thread {

   public void run(){
      Process p=Runtime.getRuntime().exec("/home/yoganandhd/project.sh");
      p.waitFor();
   }
}

Теперь вызовите этот поток из вашего фактического потока, как показано ниже, вместо прямого вызова задания.

MyThread myThread = new MyThread();
myThread .start();
17.06.2014
  • это решает только половину проблемы, хотя это не так. 17.06.2014
  • @ScaryWombat, какую другую половину это не решает? Это выполнит задание в отдельном потоке, тогда как основной поток перенаправит на login.jsp. Я думаю, это то, чего хочет ОП. 17.06.2014
  • Я читаю, что для отображения некоторых данных пользователю необходим некоторый интеллектуальный анализ данных. 17.06.2014
  • @ScaryWombat, прочитайте вопрос правильно, прежде чем отрицать ответ. Он говорит, что ему нужно перенаправить на login.jsp немедленно, не дожидаясь. Он нигде не упомянул, что ему нужно показать какие-то данные пользователю после завершения сбора данных. 17.06.2014
  • @Dinal, да, твой обряд я хочу немедленно перенаправить. Я пробовал аналогичный код, который перенаправляет на следующую страницу, но не выполняет сценарий оболочки. когда я пытался выполнить сценарий оболочки вручную в оболочке, он работает нормально, но с использованием потока он не работает. 17.06.2014
  • @ user3364049, вы получаете какую-либо ошибку? Вы пытались выполнить код для вызова шеллскрипта отдельно, скажем, из метода main()? 17.06.2014
  • @Dinal да, я пробовал, я не получаю никаких ошибок, он напрямую перенаправляется на следующий jsp. 17.06.2014
  • @Dinal это то, что я сделал ‹%! открытый класс MyThread расширяет поток {public void run(){ try{Process p=Runtime.getRuntime().exec(/home/yoganandhd/project.sh); р.ждите(); } catch(Exception e) { e.printStackTrace(); } } } %› ‹% MyThread myThread = new MyThread(); myThread.start(); ответ.sendRedirect(логин.jsp); %› 17.06.2014
  • @ user3364049, удалите этот контент класса MyThread из java. Вместо этого создайте новый файл класса с именем MyThread.java и переместите туда содержимое скриптлета. Затем импортируйте класс в свой jsp, используя ‹%@ page import=package1.myClass1 %›. 17.06.2014
  • @Dinal Я создал файл класса с именем MyThread.java и переместил содержимое класса MyThread в этот файл. затем я импортировал этот java-файл на свою страницу jsp, а затем на странице jsp я создал объект для класса MyThread и выполнил программу, даже если файл .sh не работает в фоновом режиме. 17.06.2014
  • @user3364049 user3364049, Не мог бы помочь, не видя вашего кода. Можете ли вы попробовать использовать сервлет вместо этих скриптлетов 17.06.2014
  • @Dinal MyThread.java: пакет com; открытый класс MyThread расширяет поток {public void run(){ Process p=Runtime.getRuntime().exec(/home/yoganandhd/project.sh); р.ждите(); } } Jsp_Page ‹%@pageimport=com.MyThread%› ‹% MyThread myThread = new MyThread(); myThread.start(); ответ.sendRedirect(логин.jsp); %› 17.06.2014
  • @Dinal Большое спасибо за вашу поддержку. хорошо, я попробую с сервлетом 17.06.2014
  • @ user3364049, я думаю, у вас есть код для выполнения команды оболочки. Вот почему я спросил, пытались ли вы выполнить эту часть самостоятельно из метода main(). Проверьте эту ссылку для выполнения сценария оболочки stackoverflow.com/questions/525212/. Если вы действительно хотите поблагодарить меня, сделайте это голосом за.. лол 17.06.2014
  • @Dinal Да, я пробовал это без использования потока из моего jsp, это сработало. Кроме того, сейчас, чтобы увидеть, правильно ли работает поток, я создал файл оболочки только для создания каталога. Когда я запускаю его отдельно, он выполняется, но не с потоками. 17.06.2014
  • @Dinal Мой jsp и скрипт оболочки хорошо работают без потока. Единственная проблема в том, что выполнение займет слишком много времени, пока пользователю не придется ждать. Для этого я пытаюсь запустить поток в фоновом режиме. Но не получить. 17.06.2014
  • @ user3364049, Если это так, вы пытались удалить p.waitFor();. Это фактически заставит этот поток ждать, пока процесс не завершится. Попробуйте этот способ и посмотрите, работает ли он. Я только сейчас заметил это. 17.06.2014
  • @Dinal Я удалил p.waitFor(), даже если он не работает. Теперь я делаю этот процесс, используя сервлеты, как вы сказали. Я обнаружил, что он входит в поток, но после этого он не выполняет сценарий оболочки. Есть ли другой способ запустить наш сценарий оболочки в сервлете?? 18.06.2014
  • @Dinal Спасибо за вашу поддержку. Код, который вы разместили, работает в сервлетах. Я сделал небольшую ошибку в сценарии оболочки, которая является проблемой. Извини.. 19.06.2014
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..