2016-01-10 4 views
0

Я хочу подключиться к серверу удаленно, что я сделал через J sch programe, , и теперь я хочу запускать два потока одновременно на этом удаленном сервере.Два потока, выполняющихся одновременно на удаленном сервере

Один поток будет контролировать ЦП Сведения о удаленном сервере, Вторая тема будет инициировать приложение на том же удаленном сервере.

Вот мой фрагмент кода для основного класса: OpenSessionForRemoteConnection() - это подкласс, использующий jsch для подключения к удаленному серверу. GetCpuDetails и InitiateApllications являются подклассами для потоков. Моя проблема заключается в том, что я создаю GetCpuDetails как обычный подкласс, а затем получаю CpuDetails без каких-либо проблем. Но когда я использую потоки, я не получаю никакого потока ввода. Я не могу определить, где я ошибся!

Я не специалист по ИТ; Кто-нибудь может помочь? или предложить мне другой вариант сделать то же самое?

ГЛАВНЫЙ КЛАСС ----

public static void main(String[] args) {   
    String host="192.168.101.191"; 
    Session session = null; 
    OpenSessionForRemoteConnection server1 = new  OpenSessionForRemoteConnection(); 

    try{ 
     System.out.println("calling the method for opening a new session"); 
     session= server1.openSession(host); 
     GetCpuDetails Cpu=new GetCpuDetails (session); 
     InitiateApllications initiate=new InitiateApllications(session); 


     Thread t1 = new Thread(Cpu); 
     Thread t2 = new Thread(initiate);  

      t1.start(); 
      t2.start(); 


     server1.closeSession(); 
    } catch(Exception e){ 
      System.out.println(e); 
    } 
    System.out.println("SESSION CLOSED--->"); 

} 

Суб класс, чтобы открыть сессию для удаленного хоста:

String user="user"; 
    String password="password"; 
    String port="22"; 

    Session session; 

/** 
* @param args 
*/ 

    /* 
* This method is for opening a session and establishing remote connection to the host 
*/ 
public Session openSession (String host){ 

    try{ 

     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     JSch jsch = new JSch(); 

     session=jsch.getSession(user, host, 22); 


     session.setPassword(password);  
     session.setConfig(config); 
     session.connect(); // New Session for Host established and connected     

    }catch(Exception e){ 
      System.out.println(e); 
    } 
    return session; 
} 

/* 
* This method id for closing the session and disconnecting the remote server. 
*/ 
public void closeSession(){  

    session.disconnect(); 

}

Этот подклассов реализует работоспособным; чтобы получить детали CPU

GetCpuDetails Открытый класс реализует Runnable {

/** 
* @param args 
*/ 
private Session session; 

public GetCpuDetails (Session MainSession){ 
    //this.command=s; 
    this.session=MainSession; 
} 

@Override 
public void run() { 
    processCommand(session);  
} 

private void processCommand(Session session) { 

    try{ 
     System.out.println("get host"); 
     if(session.isConnected()){ 
      System.out.println("SESSION STILL CONNECTED------------->");  
     }  

     try{ 

      Channel channelForCPUDetails=channelForCPUDetails=session.openChannel("exec"); 
      ((ChannelExec)channelForCPUDetails).setCommand("iostat");    

      channelForCPUDetails.setInputStream(null); 
      ((ChannelExec)channelForCPUDetails).setErrStream(System.err); 

      InputStream in=channelForCPUDetails.getInputStream(); 
      channelForCPUDetails.connect(); 


      byte[] tmp=new byte[1024]; 
      while(true){ 
       while(in.available()>0){ 
        System.out.printf("INSIDE WHILE->"+channelForCPUDetails.getInputStream()); 
        int i=in.read(tmp, 0, 1024); 
        if(i<0)break; 

        System.out.print(new String(tmp, 0, i)); 

       } 
       if(channelForCPUDetails.isClosed()){ 
        System.out.println("exit-status: "+channelForCPUDetails.getExitStatus()); 
        break; 
       } 
       } 

      channelForCPUDetails.disconnect();   


    }catch(Exception e){ 
      System.out.println(e); 
    } 


} 


private void suspendThread(){  
    try { 
     Thread.sleep(4000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}

ответ

1

Ваш вопрос в том, что вы закрываете сеанс слишком рано, как это:

t1.start(); 
t2.start(); 
server1.closeSession(); 

Вы вводя сеанс в ваши потоки. Вы не можете гарантировать, что ваши потоки будут использовать эти сеансы на сервере, прежде чем закрыть сеанс в своем основном потоке. Я предлагаю вам дождаться завершения ваших потоков (либо через CyclicBarrier, либо CountdownLatch, например,), а затем вы закроете сеанс.

0

Как сказал SMA, вы выходите до того, как потоки закончены. Вам нужно дождаться завершения этих потоков. Вы можете сделать это, «присоединяясь» к начатым потокам. Измените свой код на это:

t1.start(); 
t2.start(); 

//Wait for the threads to finish 
t1.join(); 
t2.join(); 

server1.closeSession(); 
+0

Спасибо ... Это сработало! :) –

Смежные вопросы