1

我正在尝试使用此类与服务器建立连接。此类获取对 HashMaps 中的图像执行操作所需的参数列表。然后在 doInBackground 中,我对 Image 所需要的操作一一进行。OVFImage Deployer 类之一的代码也粘贴在下面

public class ImageDeployer extends SwingWorker<Boolean,String> {


    public ImageDeployer(){

    }

    public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    // TODO Auto-generated constructor stub
    this.volIDMap = volIDMap;
    this.osMap = osMap;
    System.out.println(volIDMap);
    System.out.println(osMap);
    makeAConnection();
    try {
        doInBackground();
        System.out.println("Do In Background");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public void makeAConnection(){

    inputFile = RESTEngine.getFilePath();
    Properties defaultProps = new Properties();
    try {
        fin = new FileInputStream(inputFile);
        defaultProps.load(fin);
        fin.close();
    }
    catch(FileNotFoundException e1){
        System.out.println("The properties file supposed to contain Authorization parameters was not found.");
        e1.printStackTrace();
        System.exit(-1); 
    }
    catch(IOException e1){
        System.out.println("An exception occured while trying to open the properties file");
        e1.printStackTrace();
        System.exit(-1);
    }
    // assign variables from Input file with default value as null
    user = defaultProps.getProperty("UserID", null);
    host = defaultProps.getProperty("PowerVC_IP_ADDRESS", null);
    password = defaultProps.getProperty("UserPass" ,null );

    jsch = new JSch();
    try {
        session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel=session.openChannel("exec");
        channel.setInputStream(null);

        try {
            in = channel.getInputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Connection Successful");
    } catch (JSchException e) {
        // TODO Auto-generated catch block
        System.out.println("Unable to connect");
        e.printStackTrace();
    }

}


@Override
protected Boolean doInBackground() throws Exception {

    ImageDeployer imageDeployer = new ImageDeployer();
    imageDeployer.makeAConnection();

    for(String imageName : volIDMap.keySet()){

        String volID = volIDMap.get(imageName);
        String oS = osMap.get(imageName);
        if (oS.equalsIgnoreCase("aix")){

            imageDeployer = new OVFImageDeployer(volID, oS, imageName);

        }
        // Other Cases depending upon the OS Type


    }
    return null;



}
}

OVFImage Deployer 的代码

public class OVFImageDeployer extends PowerVCImageDeployer {

public OVFImageDeployer(String VolID,String oS,String imageName){

    String command="/usr/bin/powervc-devtools/powervc-devcli glance image-create json "+imageName+" "+oS+" "+VolID;

    try {


        ((ChannelExec)channel).setCommand(command);
        channel.connect();
    } catch (JSchException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

现在,当我运行代码时,我得到了一个NullPointerException在线 ((ChannelExec)channel).setCommand(command). 我知道如果我makeAConnection在代码中的 try 块之后放置OVFImageDeployer会起作用,但是我不想一次又一次地建立连接。我希望一个连接只初始化一次,并且所有操作都只使用该连接执行。

4

1 回答 1

1

您应该doInBackground从以下构造函数中删除对的调用ImageDeployer

public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    ....
    makeAConnection();
    //doInBackground();
    ...
}

这将channel在您创建ImageDeployer. 您可以添加channel到以下构造函数参数列表中OVFImageDeployer

public OVFImageDeployer(String VolID,String oS,String imageName, Channel channel){

this.channel = channel;
...
}

这将创建一个具有实例中OVFImageDeployer存在channelImageDeployer实例。您需要从方法内部删除这两个语句,并在构造以下实例时与其他参数一起doInBackground传递:channelOVFImageDeployer

@Override
protected Boolean doInBackground() throws Exception {

//ImageDeployer imageDeployer = new ImageDeployer();
//imageDeployer.makeAConnection();
...
ImageDeployer imageDeployer = new OVFImageDeployer(volID, oS, imageName, channel);
...
}

现在客户端代码可以创建一个实例ImageDeployer并可以doInBackground在其上执行:

ImageDeployer imageDeployer = new ImageDeployer();
imageDeployer.doInBackground();

这样,每次OVFImageDeployer在方法内部创建实例时doInBackground,都可以使用在构造实例时channelmakeAConnection方法创建的ImageDeployer实例。

于 2013-09-30T16:55:30.243 回答