Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать / 11 сообщений из 11, страница 1 из 1
10.11.2006, 11:18:59
    #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
10.11.2006, 12:24:33
    #34119042
MBasil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
Признаюсь текст читал не очень внимательно, но на вопрос
ответить можно так: для считывания информации с каждого объекта,
pfgecrfqnt отдельный поток. Все потоки находятся в списке (пул).
И еще один поток должен периодически просматривать весь пул,
находить зависшие потоки и "убивать" их.
...
Рейтинг: 0 / 0
10.11.2006, 12:39:34
    #34119117
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
Код: plaintext
Session sess = conn.openSession();
- поясните эту строчку. Какие классы здесь используются?
...
Рейтинг: 0 / 0
10.11.2006, 13:03:48
    #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
10.11.2006, 13:27:05
    #34119346
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
Соглашусь с MBasil, похоже без "контрольного потока" не обойтись
...
Рейтинг: 0 / 0
10.11.2006, 13:35:48
    #34119383
peter6636
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
MBasilПризнаюсь текст читал не очень внимательно, но на вопрос
ответить можно так: для считывания информации с каждого объекта,
pfgecrfqnt отдельный поток. Все потоки находятся в списке (пул).
И еще один поток должен периодически просматривать весь пул,
находить зависшие потоки и "убивать" их.
подробнее можна пожалуйста, как пул создать
...
Рейтинг: 0 / 0
10.11.2006, 13:49:07
    #34119443
peter6636
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
Ну короче потоки я создам, типа:
Код: plaintext
1.
2.
 class  NewThread  implements  Runnable {
     public  Thread t;
...........................................
а как мне реализовать поток который будет убивать зависшые,и как он будет понимать,что поток Х висит
...
Рейтинг: 0 / 0
10.11.2006, 14:18:02
    #34119582
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
У потока заведите поля с датой запуска и флагом что команда которую Вы шлете по SSH прошла. Ссылки на создаваемые потоки помещайте в массив.

Создайте отдельный контрольный поток, который с некоторым таймаутом проходится в бесконечном цикле по массиву с ссылкам на "подконтрольные" потоки и проверяйте дату создания подконтрольного потока и флаг состояния, если разница текущей даты и даты создания более 2 мин и флаг говорит что команда еще не прошла, этот подконтрольный поток убивается.
...
Рейтинг: 0 / 0
10.11.2006, 17:17:45
    #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
10.11.2006, 17:36:26
    #34120340
max_from_sumy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать
Очевидно вы с тредами вообще не знакомы. А стоило бы изучить, вещь важная.
Метод run() будет выполнятся в отдельном потоке, т.е. ничего не зависнет
...
Рейтинг: 0 / 0
10.11.2006, 18:56:36
    #34120557
G.
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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