赞
踩
云服务平台仿真--身份认证/授权/申请和释放IT资源
CloudSim可以模拟云服务的各类底层方法。在省略技术细节的前提下, 可以实现一个人机交互界面,通过调用CloudSim的库函数来模拟一个 能够满足云用户申请和使用IT资源的云服务平台(功能参考阿里云平台)。
开发一个基于CloudSim仿真的云服务平台,并至少实现以下功能:
源码:功能不全,比较简陋,而且释放资源的时候还会报错。
- package org.cloudbus.cloudsim;
- import java.util.HashMap;
- import java.util.Scanner;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
-
- public class zzf {
- private static Map<String, List<Vm>> VMmap = new HashMap<>();
- // 查看并打印与给定ID关联的用户下的所有IT资源(虚拟机由Vm类表示),接受一个字符串参数ID
- private static void viewResources(String ID){
- List<Vm> vmlist; //声明了一个Vm类型的列表 vmlist,用于存储与给定 ID 关联的虚拟机
-
- //检查VMmap中的用户ID
- if(VMmap.get(ID) == null) { //VMmap中没有和ID关联的列表
- vmlist = new ArrayList<Vm>(); //创建新的空Vm列表
- VMmap.put(ID,vmlist); //将该列表与ID存取在VMmap中
-
- System.out.println( ID +",此用户暂无任何IT资源---------\n");
- } else {
- //从VMmap中获取与ID关联的Vm列表
- vmlist = VMmap.get(ID);
- }
-
- //遍历并打印虚拟机信息 使用迭代器遍历vmlist中的每一个Vm对象
- for (Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
- Vm vm = iterator.next();
- System.out.println("当前用户" + ID + "编号为" + vm.getId() + "的虚拟机!!");
- System.out.println("-------------------------------------------------");
- System.out.println("用户的宽带 :" + vm.getBw() + "Mbps");
- System.out.println("用户的CPU数量:" + vm.getNumberOfPes());
- System.out.println("用户的内存:" + vm.getRam() + "MB");
- System.out.println("\n");
- }
- }
-
- // 申请各类IT资源
- public static void applyResource(String ID) {
- Scanner sc = new Scanner(System.in);
- List<Vm> vmlist;
- String num = null;
-
- if(VMmap.get(ID) == null){
- vmlist = new ArrayList<Vm>();
- VMmap.put(ID,vmlist);
- } else {
- vmlist = VMmap.get(ID);
- }
-
- System.out.println("选择默认参数,输入1:");
- if(sc.hasNext()){
- num = sc.next();
- }
-
- // VM 对象
- long ram = 2048; // RAM 容量(MB)
- long bw = 100; //带宽Mbps()
- int pesNumber = 1;// PE 数量
-
-
- if(num.equals("1")){
- System.out.println("默认申请的规格具体如下:");
- System.out.println("----------------------------------------");
- System.out.println("CPU个数: "+ pesNumber);
- System.out.println("内存 :"+ram+"MB");
- System.out.println("带宽 :"+bw +"Mbps");
- System.out.println("----------------------------------------");
- }
- }
-
- // 释放vmID的IT资源
- public static void releaseRes(String ID, String vmID) {
- Scanner sc = new Scanner(System.in);
- String choice = null;
- List<Vm> vmlist = VMmap.get(ID);
- Vm vm = null;
-
- for(Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
- vm = iterator.next();
- if((vm.getId() + "").equals(vmID)) break;
- }
-
- tar: while (true) {
- System.out.println("您想要释放哪些IT资源?");
- System.out.println("输入0: 返回");
- System.out.println("输入数字1: 带宽");
- System.out.println("输入数字2: 内存");
- System.out.println("输入数字3: 存储空间");
- System.out.println("请选择:");
- if(sc.hasNext()){
- choice = sc.next();
- }
-
- long ramSize = vm.getRam();
-
- if(choice.equals("3")) {
- System.out.println(vmID+"号虚拟机一共有"+vm.getSize()+"MB"+"想要释放多少存储空间?");
- long num1 = sc.nextLong();
- num1 = vm.getSize() - num1;
- vm.setSize(num1);
- } else if (choice.equals("2")){
- System.out.println(vmID+"号虚拟机一共有"+ramSize+"MB"+"想要释放多少内存空间?");
- int num2 = sc.nextInt();
- num2 = vm.getRam() - num2;
- vm.setRam(num2);
- } else if (choice.equals("1")) {
- System.out.println(vmID+"号虚拟机一共有"+ vm.getBw()+"M"+"想要释放多少带宽?");
- } else if (choice.equals("0")) {
- break tar;
- }
- }
- }
-
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- Log.printLine("Starting zzf...");
-
- while (true) {
- System.out.println("请输入用户ID进行操作或输入'exit'退出:");
- String userID = scanner.nextLine();
-
- if (userID.equals("exit")) {
- break;
- }
-
- System.out.println("选择操作:\n1. 查看IT资源\n2. 申请IT资源\n3. 释放IT资源\n请输入选项:");
- String choice = scanner.nextLine();
-
- switch (choice) {
- case "1":
- viewResources(userID);
- break;
- case "2":
- applyResource(userID);
- break;
- case "3":
- System.out.println("请输入要释放的虚拟机ID:");
- String vmID = scanner.nextLine();
- releaseRes(userID, vmID);
- break;
- default:
- System.out.println("无效的选项,请重新输入.");
- }
- }
-
- Log.printLine("zzf finished!");
- scanner.close();
- }
- }

报错位置:释放资源功能
报错信息:Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.cloudbus.cloudsim.Vm.getRam()" because "vm" is null。
chatGPT给出的建议:
通常表示你尝试访问一个尚未被初始化或已设为
null
的对象的方法或属性。从你提供的错误信息来看,可能是在某个地方尝试访问一个未成功创建或未正确引用的Vm
实例的 RAM。错误可能出现在处理
releaseResources
方法中,尝试访问已删除或未找到的Vm
对象。为了避免这个问题,我们需要在尝试访问Vm
对象之前,确保其存在。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。