powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / сервлет, многопоточность
3 сообщений из 3, страница 1 из 1
сервлет, многопоточность
    #33719185
fcs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fcs
Гость
Здравствуйте!
Помогите разобраться с ситуацией. Имею Сервлет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
 public   class  taskimport  extends  HttpServlet{
    
     private   int  counter;
     private  ServletContext context;
     private  String message;
     private   int  taskCounter;
     private  HashMap tasks;
    
     public   void  init(ServletConfig config) {
        tasks =  new  HashMap();
    }

     protected   void  processRequest(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
         try {
            //берем параметры, проверяем их на пригодность использования
//создаемобъект для импорта данных (новый поток)
            dbimpProcess pr =  new  dbimpProcess(taskdbinfo, filenameId);
            taskCounter++;
            tasks.put(taskCounter+"", pr);
            response.setContentType("text/xml");
                response.setHeader("Cache-Control", "no-cache");
                PrintWriter pw = response.getWriter();
                pw.write("<message><impid>"+taskCounter +"</impid><status>started</status></message>");
                pw.flush()
               } catch (Exception e){ e.printStackTrace(); }
         }

      class  dbimpProcess  extends  Thread{
        
         private  String dbname;
         private   int  filenameId;
         private  String _curimpTable="";
         private   int  dbf_record_count= 0 ;
         private   int  cur_added_line= 0 ;
         private   boolean  _finished;
         private   int  ctn;
        
         public   void  run() {
           while  (true) {
                test();
                 if (_finished)   return ;
                 try {
                  sleep( 900 );
                } catch (InterruptedException e){
                  e.printStackTrace();
                }
            ctn++;
          }
        }
    
         public  dbimpProcess(String dbname,  int  filenameId){
             this .dbname = dbname;
             this .filenameId = filenameId;
            setPriority(Thread.MIN_PRIORITY);
            start();
        }
        
         public   void  test(){
            RunProgram("d:programm.bat","");  //Запускаю внешную программу, которая занимается импортом данных в БД
            _finished = true;
        }

в функции RunProgram я обрабатываю сообщения, выдаваемые программой в поток (консоль). Если там сообщение равно определенным параметрам то _curimpTable, cur_added_line принимают значения (текущей импортируемой таблицы и количеству занесенных записей). Эти параметры потом я возвращаю клиенту с помощью AJAX.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 boolean  isfinished = ((dbimpProcess)tasks.get(taskimpId))._finished;
                     if (isfinished==true){
                        System.out.println("isfinished");
                        response.setContentType("text/xml");
                        response.setHeader("Cache-Control", "no-cache");
                        PrintWriter pw = response.getWriter();
                        pw.write("<message><impid>"+taskimpId +"</impid><status>finished</status><imptable>finished</imptable></message>");
                        pw.flush();
                    } else {
                        ARC_lastValue = ((dbimpProcess)tasks.get(taskimpId)).cur_added_line;
                        IMP_Table = ((dbimpProcess)tasks.get(taskimpId))._curimpTable;
                         if ((messageHash != null ) && (Integer.valueOf(messageHash).intValue() == ARC_lastValue)){
                            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
                        } else {
                            cur_table = ((dbimpProcess)tasks.get(taskimpId))._curimpTable;
                            response.setContentType("text/xml");
                            response.setHeader("Cache-Control", "no-cache");
                            PrintWriter pw = response.getWriter();
                            //pw.write("<message>processing<curtable>" + cur_table +  "</curtable><ARC>" + ARC_lastValue +  "</ARC></message>");
                            pw.write("<message><impid>"+taskimpId+"</impid><status>" + ARC_lastValue +  "</status><imptable>"+IMP_Table+"</imptable></message>");
                            pw.flush();
                        }
                    }

Проблема в том, что иногда значения возвращаются и обновляются у клиента в browser а иногда нет.

Если понадобиться - могу выложить код (JavaScript) клиента.
...
Рейтинг: 0 / 0
сервлет, многопоточность
    #33719413
О многопоточности слышали... Метод processRequest может быть вызван одновременно несколькими потоками (для разных HTTP-запросов) на одном экземпляре сервлета. Поэтому хотя бы, вместо
Код: plaintext
1.
2.
    private int taskCounter;
    private HashMap tasks;
что-нить вроде
Код: plaintext
1.
2.
    private final Map tasks = Collections.synchronizedMap(new HashMap());
    //taskCounter вообще не нужен, это tasks.size()
Ну или совсем простой вариант, все содержимое processRequest обернуть в synchronized(this) {...}

Хм...put у вас есть, а remove нет...странно.
...
Рейтинг: 0 / 0
сервлет, многопоточность
    #33728330
Макарон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, хочу спросить вот про что:

есть класс FileUtil, в котором несколько методов, для работы с файлом.

есть фильтр - который пишет каждый запрос в файл с помощью методов класса FileUtil.

еще есть поток, который создается при старте апликухи (в сервлете в методе инит). Так вот этот поток раз в час тоже разбирает файл с помощью методов класса FileUtil.

Вопрос. Как это все синхронизировать, с потоками столкнулся впервые...

З.Ы. Есть такая идея, что в момент выхода второго потока(тот который раз в час просыпается) надо как-то тормознуть главный(первый поток), обработать файл, а потом продолжить главный??? Тока как это сделать?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / сервлет, многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]