powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать
11 сообщений из 11, страница 1 из 1
Как правильно сделать
    #34118692
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче есть код который обращается к этажным комутаторам для считывания из них логов:
Код: 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.
     for ( int  i= 0 ;i<switchList.size();i++){
                          Session sess = conn.openSession();
          if (switchList.elementAt(i).toString().trim().equals("10.100.0.12")||switchList.elementAt(i).toString().trim().equals("10.100.0.133")||switchList.elementAt(i).toString().trim().equals("172.17.1.30")){
                         } else {
                    BeanAllData bean= new  BeanAllData();
                    Vector row= new  Vector();
                    sess.execCommand("sudo -u differ rsh "+switchList.elementAt(i).toString().trim()+" sh mac-address-table | grep -v Gi | grep -v CPU");

                               InputStream stdout =  new  StreamGobbler(sess.getStdout());
                               br =  new  BufferedReader( new  InputStreamReader(stdout));
                                 while  (true){
                                   String line = br.readLine();
                                      if (line== null ){
                                     } else {
                                        out.write(line+" "+switchList.elementAt(i).toString().trim()+"\n");
                                     }
                                  if  (line ==  null ){
                                     out.close();
                                     br.close();
                                    break ;
                                       }
                                      }
                                      sess.close();

                         }
                    }
Все красиво работает, но бывает ситуация,когда какой-нибудь из комутаторов не отвечает, т.е. выполнение кода тормозит на запуске команды
Код: plaintext
sess.execCommand("sudo -u differ rsh "+switchList.elementAt(i).toString().trim()+" sh mac-address-table | grep -v Gi | grep -v CPU");
switchList- содержит айпишники комутаторов
как сделать так,чтобы если комутатор не отвечает например 2 минуты,программа пропустила его опрос и перешла к опросу следующего комутатора
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119042
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Признаюсь текст читал не очень внимательно, но на вопрос
ответить можно так: для считывания информации с каждого объекта,
pfgecrfqnt отдельный поток. Все потоки находятся в списке (пул).
И еще один поток должен периодически просматривать весь пул,
находить зависшие потоки и "убивать" их.
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119117
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Session sess = conn.openSession();
- поясните эту строчку. Какие классы здесь используются?
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119246
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
Код: plaintext
Session sess = conn.openSession();
- поясните эту строчку. Какие классы здесь используются?
юзаю
Код: plaintext
1.
2.
 import  ch.ethz.ssh2.Connection;
 import  ch.ethz.ssh2.KnownHosts;
 import  ch.ethz.ssh2.Session;
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119346
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соглашусь с MBasil, похоже без "контрольного потока" не обойтись
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119383
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilПризнаюсь текст читал не очень внимательно, но на вопрос
ответить можно так: для считывания информации с каждого объекта,
pfgecrfqnt отдельный поток. Все потоки находятся в списке (пул).
И еще один поток должен периодически просматривать весь пул,
находить зависшие потоки и "убивать" их.
подробнее можна пожалуйста, как пул создать
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119443
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну короче потоки я создам, типа:
Код: plaintext
1.
2.
 class  NewThread  implements  Runnable {
     public  Thread t;
...........................................
а как мне реализовать поток который будет убивать зависшые,и как он будет понимать,что поток Х висит
...
Рейтинг: 0 / 0
Как правильно сделать
    #34119582
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У потока заведите поля с датой запуска и флагом что команда которую Вы шлете по SSH прошла. Ссылки на создаваемые потоки помещайте в массив.

Создайте отдельный контрольный поток, который с некоторым таймаутом проходится в бесконечном цикле по массиву с ссылкам на "подконтрольные" потоки и проверяйте дату создания подконтрольного потока и флаг состояния, если разница текущей даты и даты создания более 2 мин и флаг говорит что команда еще не прошла, этот подконтрольный поток убивается.
...
Рейтинг: 0 / 0
Как правильно сделать
    #34120268
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот не могу одну вещь понять,есть цикл:
Код: plaintext
1.
2.
3.
4.
5.
 for ( int  i= 0 ;i<switchList.size();i++){
        ThreadSwitch thr= new  ThreadSwitch(switchList.elementAt(i).toString());
        thr.run();
        threadCount.add(thr);
     }
ThreadSwitch extend Thread

в классе ThreadSwitch идет запуск команды, вопрос: если эта команда будет долго "думать", то я не выйду из for пока не закончится её выполнение , я тогда не вижу смысла в потоках, поясните чё я еще не догнал
...
Рейтинг: 0 / 0
Как правильно сделать
    #34120340
max_from_sumy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно вы с тредами вообще не знакомы. А стоило бы изучить, вещь важная.
Метод run() будет выполнятся в отдельном потоке, т.е. ничего не зависнет
...
Рейтинг: 0 / 0
Как правильно сделать
    #34120557
G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще для 1.5 можно воспользоваться пакетом java.util.concurrent,
простенький пример:
Код: 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.
62.
63.
 import  java.util.HashMap;
 import  java.util.Iterator;
 import  java.util.concurrent.*;

 public   class  MyThread  implements  Runnable {

     private  ExecutorService executorService = Executors.newCachedThreadPool();

     private  HashMap<Future,  Long > tasks =  new  HashMap<Future,  Long >();

     private  Thread runner;

     public  MyThread(String[] hosts) {
         for  ( final  String host : hosts) {
            FutureTask<String> future =
                     new  FutureTask<String>( new  Callable<String>() {
                         public  String call() {
                            /**
                             * Ваш код
                             * sess.execCommand("sudo -u differ rsh "+switchList.elementAt(i).toString().trim()+" sh mac-address-table | grep -v Gi | grep -v CPU");
                             * ...
                             */
                             return  host;
                        }
                    });
            executorService.execute(future);
            tasks.put(future, System.currentTimeMillis());
        }
    }

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

     public   static   void  main(String [] args) {
        String [] s = {"host1", "host2", "host3", "host4", "host5", "host6", "host7"};
        MyThread thread =  new  MyThread(s);
        thread.start();
    }

     public   void  run() {
         while (!tasks.isEmpty()) {
             for  (Iterator<Future> iter = tasks.keySet().iterator(); iter.hasNext();) {
                Future future = iter.next();
                 boolean  isTimeout = System.currentTimeMillis() - tasks.get(future) >  2 * 60 * 1000 ;
                 if  (future.isDone()) {
                    iter.remove();
                }  else   if  (isTimeout) {
                    future.cancel(true);
                    iter.remove();
                }
            }
             try  {
                Thread.sleep( 100 );
            }  catch  (InterruptedException e) {
                e.printStackTrace();
            }
        }
        executorService.shutdown();        
    }

}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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