2012-02-08 32 views
0

我写这应该阻止,直到列表中的所有情况下都没有在一个特定的状态,所以这里的功能是什么,我有:阻塞,直到所有EC2实例处于特定状态?

private void waitForInstanceState(List<String> instancesId, InstanceStateName state) { 
    int numAchievedState = 0; 

    while (numAchievedState != instancesId.size()) { 

     numAchievedState = 0; 

     DescribeInstanceStatusRequest describeRequest = new DescribeInstanceStatusRequest().withInstanceIds(instancesId); 
     DescribeInstanceStatusResult instanceStatus = ec2.describeInstanceStatus(describeRequest); 

     for (InstanceStatus status : instanceStatus.getInstanceStatuses()) { 
      if (status.getInstanceState().getName().equals(state.toString())) { 
       numAchievedState++; 
      } 
     } 

     try { 
      Thread.sleep(15000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(AmazonLibrary.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

调用上面的函数的代码是这样的:

public void startInstace(List<String> instancesId) { 

    StartInstancesRequest startRequest = new StartInstancesRequest(instancesId); 
    ec2.startInstances(startRequest); 

    waitForInstanceState(instancesId, InstanceStateName.Running); 

    System.out.println("The instance has been started"); 


} 

事情有时被描述的实例请求返回null InstanceStatus,我认为应该永远不会发生,因为亚马逊的一个实例总是有一个状态?另外,当在instanceRun函数中使用时,它在InstanceStateName设置为Stopped的情况下运行时不起作用。没有例外或错误被抛出。

回答

1

下做的工作:

private void waitForInstanceState(List<String> instancesId, InstanceStateName state) { 
     int numAchievedState = 0; 

     while (numAchievedState != instancesId.size()) { 

      try { 
       Thread.sleep(15000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(AmazonLibrary.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      numAchievedState = 0; 

      DescribeInstancesRequest describeInstance = new DescribeInstancesRequest().withInstanceIds(instancesId); 
      DescribeInstancesResult describeResult = ec2.describeInstances(describeInstance); 
      List<Reservation> reservations = describeResult.getReservations(); 

      //different instances might be in different reservation requests 
      //so we need to traverse those 
      for (Reservation reservation : reservations) { 
       List<Instance> instances = reservation.getInstances(); 
       for (Instance instance : instances) { 
        if (instance.getState().getName().equals(state.toString())) { 
         numAchievedState++; 
        } 
       } 
      } 
     } 
    } 
相关问题