add start and stop record
This commit is contained in:
parent
6248013221
commit
f2a02bb374
6
pom.xml
6
pom.xml
|
@ -11,6 +11,11 @@
|
||||||
<name>TCSE, ISCAS</name>
|
<name>TCSE, ISCAS</name>
|
||||||
</organization>
|
</organization>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.2.4</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
|
@ -52,6 +57,7 @@
|
||||||
<artifactId>sigar</artifactId>
|
<artifactId>sigar</artifactId>
|
||||||
<version>1.6.4</version>
|
<version>1.6.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>dom4j</groupId>
|
<groupId>dom4j</groupId>
|
||||||
<artifactId>dom4j</artifactId>
|
<artifactId>dom4j</artifactId>
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
package org.bench4q.monitor;
|
package org.bench4q.monitor;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.Timer;
|
|
||||||
|
|
||||||
import org.bench4q.monitor.service.TimerService;
|
|
||||||
import org.eclipse.jetty.server.Connector;
|
import org.eclipse.jetty.server.Connector;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.server.bio.SocketConnector;
|
import org.eclipse.jetty.server.bio.SocketConnector;
|
||||||
|
@ -76,11 +72,7 @@ public class MonitorServer {
|
||||||
|
|
||||||
public static void main(String[] args) throws InterruptedException {
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
|
||||||
MonitorServer monitorServer = new MonitorServer(5556);
|
MonitorServer monitorServer = new MonitorServer(5557);
|
||||||
monitorServer.start();
|
monitorServer.start();
|
||||||
Timer timer = new Timer();
|
|
||||||
timer.schedule(new TimerService(), 1000, 60000);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.bench4q.monitor.api;
|
||||||
|
|
||||||
|
import java.util.Timer;
|
||||||
|
|
||||||
|
import org.bench4q.monitor.service.TimerService;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/monitor")
|
||||||
|
public class StartToRecord {
|
||||||
|
private Timer timer = new Timer();
|
||||||
|
|
||||||
|
@RequestMapping("/start")
|
||||||
|
@ResponseBody
|
||||||
|
public String start() {
|
||||||
|
timer.schedule(new TimerService(), 1000, 2000);
|
||||||
|
return new String("startted");
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/stop")
|
||||||
|
@ResponseBody
|
||||||
|
public String stop() {
|
||||||
|
timer.cancel();
|
||||||
|
return new String("stopped");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,17 +14,29 @@ import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.hyperic.sigar.FileSystemUsage;
|
import org.hyperic.sigar.FileSystemUsage;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement(name = "fileSystem")
|
@XmlRootElement(name = "fileSystem")
|
||||||
public class FileSystemModel {
|
public class FileSystemModel {
|
||||||
|
@Expose
|
||||||
private String fileDir;
|
private String fileDir;
|
||||||
|
@Expose
|
||||||
private Double diskReadKBytesRate;
|
private Double diskReadKBytesRate;
|
||||||
|
@Expose
|
||||||
private Double diskWriteKBytesRate;
|
private Double diskWriteKBytesRate;
|
||||||
|
@Expose
|
||||||
private double curDiskQueLength;
|
private double curDiskQueLength;
|
||||||
|
@Expose
|
||||||
private double totalGB;
|
private double totalGB;
|
||||||
|
@Expose
|
||||||
private double usedGB;
|
private double usedGB;
|
||||||
|
@Expose
|
||||||
private double freeGB;
|
private double freeGB;
|
||||||
|
@Expose
|
||||||
private double usedPercent;
|
private double usedPercent;
|
||||||
|
@Expose
|
||||||
private double diskTotalKBytesRate;
|
private double diskTotalKBytesRate;
|
||||||
|
|
||||||
private FileSystemUsage fileSystemUsage;
|
private FileSystemUsage fileSystemUsage;
|
||||||
|
|
||||||
public static void main(String args[]) throws SigarException,
|
public static void main(String args[]) throws SigarException,
|
||||||
|
@ -193,6 +205,7 @@ class CalculateDiskWriteRate extends CalculateDiskRate {
|
||||||
long getFileKBytes() throws SigarException {
|
long getFileKBytes() throws SigarException {
|
||||||
return fileSystemUsage.getDiskWriteBytes() / 1024L;
|
return fileSystemUsage.getDiskWriteBytes() / 1024L;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CalculateDiskReadRate extends CalculateDiskRate {
|
class CalculateDiskReadRate extends CalculateDiskRate {
|
||||||
|
@ -206,4 +219,5 @@ class CalculateDiskReadRate extends CalculateDiskRate {
|
||||||
|
|
||||||
return fileSystemUsage.getDiskReadBytes() / 1024L;
|
return fileSystemUsage.getDiskReadBytes() / 1024L;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,42 +1,50 @@
|
||||||
package org.bench4q.monitor.model;
|
package org.bench4q.monitor.model;
|
||||||
|
|
||||||
|
import java.beans.Transient;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.bench4q.monitor.service.GetSigar;
|
import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
import org.hyperic.sigar.Swap;
|
import org.hyperic.sigar.Swap;
|
||||||
import org.hyperic.sigar.Sigar;
|
import org.hyperic.sigar.Sigar;
|
||||||
import org.hyperic.sigar.Mem;
|
import org.hyperic.sigar.Mem;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement(name = "Memory")
|
@XmlRootElement(name = "Memory")
|
||||||
public class MemoryModel {
|
public class MemoryModel {
|
||||||
|
@Expose
|
||||||
private long pagesPerSecond;
|
private long pagesPerSecond;
|
||||||
|
@Expose
|
||||||
private long pagesInputPerSecond;
|
private long pagesInputPerSecond;
|
||||||
|
@Expose
|
||||||
private long pagesOutputPerSecond;
|
private long pagesOutputPerSecond;
|
||||||
|
@Expose
|
||||||
private long availableKiloBytes;
|
private long availableKiloBytes;
|
||||||
|
@Expose
|
||||||
private long totalKiloBytes;
|
private long totalKiloBytes;
|
||||||
|
@Expose
|
||||||
private double memoryUsedPercent;
|
private double memoryUsedPercent;
|
||||||
|
@Expose
|
||||||
private double swapKiloBytes;
|
private double swapKiloBytes;
|
||||||
|
@Expose
|
||||||
private double swapFreeKiloBytes;
|
private double swapFreeKiloBytes;
|
||||||
private Sigar sigar = GetSigar.getSigar();
|
private Sigar sigar = GetSigar.getSigar();
|
||||||
private Swap swap;
|
private Swap swap;
|
||||||
private Mem mem;
|
private Mem mem;
|
||||||
private Logger logger = Logger.getLogger(MemoryModel.class);
|
|
||||||
|
|
||||||
// test code
|
|
||||||
public static void main(String[] args) throws SigarException {
|
public static void main(String[] args) throws SigarException {
|
||||||
MemoryModel model = new MemoryModel();
|
MemoryModel model = new MemoryModel();
|
||||||
System.out.println(model.logger.getLoggerRepository());
|
|
||||||
System.out.println("PagesRate: " + model.getPagesPerSecond());
|
System.out.println("PagesRate: " + model.getPagesPerSecond());
|
||||||
System.out.println("PagesIn: " + model.getPagesInputPerSecond());
|
System.out.println("PagesIn: " + model.getPagesInputPerSecond());
|
||||||
System.out.println("PagesIn: " + model.getPagesOutputPerSecond());
|
System.out.println("PagesIn: " + model.getPagesOutputPerSecond());
|
||||||
System.out.println("UsedPerc: " + model.getMemoryUsedPercent()+"%");
|
System.out.println("UsedPerc: " + model.getMemoryUsedPercent() + "%");
|
||||||
System.out.println("Total: " + model.getTotalKiloBytes()+"kb");
|
System.out.println("Total: " + model.getTotalKiloBytes() + "kb");
|
||||||
System.out.println("Aval: " + model.getAvailableKiloBytes()+"kb");
|
System.out.println("Aval: " + model.getAvailableKiloBytes() + "kb");
|
||||||
System.out.println("swap total:"+model.getSwapKiloBytes()+"kb");
|
System.out.println("swap total:" + model.getSwapKiloBytes() + "kb");
|
||||||
System.out.println("swap free :"+model.getSwapFreeKiloBytes()+"kb");
|
System.out.println("swap free :" + model.getSwapFreeKiloBytes() + "kb");
|
||||||
}
|
}
|
||||||
|
|
||||||
public MemoryModel() throws SigarException {
|
public MemoryModel() throws SigarException {
|
||||||
|
@ -62,7 +70,7 @@ public class MemoryModel {
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public long getPagesInputPerSecond() throws SigarException {
|
public long getPagesInputPerSecond() throws SigarException {
|
||||||
swap = sigar.getSwap();
|
swap = sigar.getSwap();
|
||||||
setPagesInputPerSecond(swap.getPageIn());
|
setPagesInputPerSecond(swap.getPageIn());
|
||||||
return pagesInputPerSecond;
|
return pagesInputPerSecond;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +81,7 @@ public class MemoryModel {
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public long getPagesOutputPerSecond() throws SigarException {
|
public long getPagesOutputPerSecond() throws SigarException {
|
||||||
swap = sigar.getSwap();
|
swap = sigar.getSwap();
|
||||||
setPagesOutputPerSecond(swap.getPageOut());
|
setPagesOutputPerSecond(swap.getPageOut());
|
||||||
return pagesOutputPerSecond;
|
return pagesOutputPerSecond;
|
||||||
}
|
}
|
||||||
|
@ -84,8 +92,8 @@ public class MemoryModel {
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public long getAvailableKiloBytes() throws SigarException {
|
public long getAvailableKiloBytes() throws SigarException {
|
||||||
mem = sigar.getMem();
|
mem = sigar.getMem();
|
||||||
setAvailableKiloBytes(mem.getActualFree()/ 1024L);
|
setAvailableKiloBytes(mem.getActualFree() / 1024L);
|
||||||
return availableKiloBytes;
|
return availableKiloBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +103,7 @@ public class MemoryModel {
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public long getTotalKiloBytes() throws SigarException {
|
public long getTotalKiloBytes() throws SigarException {
|
||||||
mem = sigar.getMem();
|
mem = sigar.getMem();
|
||||||
setTotalKiloBytes(mem.getTotal() / 1024L);
|
setTotalKiloBytes(mem.getTotal() / 1024L);
|
||||||
return totalKiloBytes;
|
return totalKiloBytes;
|
||||||
}
|
}
|
||||||
|
@ -106,7 +114,7 @@ public class MemoryModel {
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public double getMemoryUsedPercent() throws SigarException {
|
public double getMemoryUsedPercent() throws SigarException {
|
||||||
mem = sigar.getMem();
|
mem = sigar.getMem();
|
||||||
long temp = Math.round(mem.getUsedPercent() * 100);
|
long temp = Math.round(mem.getUsedPercent() * 100);
|
||||||
setMemoryUsedPercent(temp / 100.0);
|
setMemoryUsedPercent(temp / 100.0);
|
||||||
return this.memoryUsedPercent;
|
return this.memoryUsedPercent;
|
||||||
|
@ -115,21 +123,50 @@ public class MemoryModel {
|
||||||
private void setMemoryUsedPercent(double memoryUsedPercent) {
|
private void setMemoryUsedPercent(double memoryUsedPercent) {
|
||||||
this.memoryUsedPercent = memoryUsedPercent;
|
this.memoryUsedPercent = memoryUsedPercent;
|
||||||
}
|
}
|
||||||
@XmlElement
|
|
||||||
|
@XmlElement
|
||||||
public double getSwapKiloBytes() {
|
public double getSwapKiloBytes() {
|
||||||
return swapKiloBytes;
|
return swapKiloBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSwapKiloBytes() {
|
private void setSwapKiloBytes() {
|
||||||
this.swapKiloBytes = this.swap.getTotal()/1024L;
|
this.swapKiloBytes = this.swap.getTotal() / 1024L;
|
||||||
}
|
}
|
||||||
@XmlElement
|
|
||||||
|
@XmlElement
|
||||||
public double getSwapFreeKiloBytes() {
|
public double getSwapFreeKiloBytes() {
|
||||||
return swapFreeKiloBytes;
|
return swapFreeKiloBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSwapFreeKiloBytes() {
|
private void setSwapFreeKiloBytes() {
|
||||||
this.swapFreeKiloBytes = this.swap.getFree()/1024L;
|
this.swapFreeKiloBytes = this.swap.getFree() / 1024L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transient
|
||||||
|
public Sigar getSigar() {
|
||||||
|
return sigar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSigar(Sigar sigar) {
|
||||||
|
this.sigar = sigar;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transient
|
||||||
|
public Swap getSwap() {
|
||||||
|
return swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSwap(Swap swap) {
|
||||||
|
this.swap = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transient
|
||||||
|
public Mem getMem() {
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMem(Mem mem) {
|
||||||
|
this.mem = mem;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.bench4q.monitor.model;
|
package org.bench4q.monitor.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
@ -11,37 +13,70 @@ import javax.xml.bind.annotation.XmlType;
|
||||||
|
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement(name = "history")
|
@XmlRootElement(name = "history")
|
||||||
@XmlType
|
@XmlType
|
||||||
public class MonitorMain {
|
public class MonitorMain {
|
||||||
/* @XmlElement
|
@Expose
|
||||||
private String date;*/
|
@XmlElement
|
||||||
|
private String date;
|
||||||
|
@Expose
|
||||||
@XmlElement(name = "processor_info")
|
@XmlElement(name = "processor_info")
|
||||||
private ProcessorModel processorModel;
|
private ProcessorModel processorModel;
|
||||||
|
@Expose
|
||||||
@XmlElement(name = "memory_info")
|
@XmlElement(name = "memory_info")
|
||||||
private MemoryModel memoryModel;
|
private MemoryModel memoryModel;
|
||||||
|
@Expose
|
||||||
@XmlElement(name = "disk_info")
|
@XmlElement(name = "disk_info")
|
||||||
private PhysicalDiskModel physicalDiskModel;
|
private PhysicalDiskModel physicalDiskModel;
|
||||||
|
@Expose
|
||||||
@XmlElement(name = "network_info")
|
@XmlElement(name = "network_info")
|
||||||
private NetworkInterfaceModel networkInterfaceModel;
|
private NetworkInterfaceModel networkInterfaceModel;
|
||||||
|
@Expose
|
||||||
@XmlElement(name = "process_info")
|
@XmlElement(name = "process_info")
|
||||||
private ProcessModel processModel;
|
private ProcessModel processModel;
|
||||||
private SimpleDateFormat dateFormat = new SimpleDateFormat(
|
private SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||||
"yyyy-MM-dd-HH-mm-ss");
|
"yyyy-MM-dd-HH-mm-ss");
|
||||||
|
|
||||||
public MonitorMain() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MonitorMain(Date date) throws SigarException, InterruptedException,
|
public MonitorMain(Date date) throws SigarException, InterruptedException,
|
||||||
ExecutionException {
|
ExecutionException {
|
||||||
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
|
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
|
||||||
/*this.date = dateFormat.format(date);*/
|
this.date = dateFormat.format(date);
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
processorModel = new ProcessorModel();
|
List<Thread> threadList = new ArrayList<Thread>();
|
||||||
|
threadList.add(new Thread(new ProcessModel(this)));
|
||||||
|
threadList.add(new Thread(new PhysicalDiskModel(this)));
|
||||||
|
threadList.add(new Thread(new ProcessorModel(this)));
|
||||||
|
threadList.add(new Thread(new NetworkInterfaceModel(this)));
|
||||||
|
for (Thread thread : threadList)
|
||||||
|
thread.start();
|
||||||
memoryModel = new MemoryModel();
|
memoryModel = new MemoryModel();
|
||||||
physicalDiskModel = new PhysicalDiskModel();
|
boolean threadIsAlive = true;
|
||||||
networkInterfaceModel = new NetworkInterfaceModel();
|
while (threadIsAlive) {
|
||||||
processModel = new ProcessModel();
|
threadIsAlive = false;
|
||||||
|
for (Thread thread : threadList) {
|
||||||
|
if (thread.isAlive())
|
||||||
|
threadIsAlive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println(System.currentTimeMillis() - startTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcesssModel(ProcessModel processModel) {
|
||||||
|
this.processModel = processModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhysicalDiskModel(PhysicalDiskModel physicalDiskModel) {
|
||||||
|
this.physicalDiskModel = physicalDiskModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcessorModel(ProcessorModel processorModel) {
|
||||||
|
this.processorModel = processorModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkInterfaceModel(
|
||||||
|
NetworkInterfaceModel networkInterfaceModel) {
|
||||||
|
this.networkInterfaceModel = networkInterfaceModel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,20 +14,25 @@ import org.bench4q.monitor.service.DataFomat;
|
||||||
import org.bench4q.monitor.service.GetSigar;
|
import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement(name = "NetworkInterface")
|
@XmlRootElement(name = "NetworkInterface")
|
||||||
public class NetworkInterfaceModel {
|
public class NetworkInterfaceModel implements Runnable {
|
||||||
|
@Expose
|
||||||
private Double kiloBytesTotalPerSecond;
|
private Double kiloBytesTotalPerSecond;
|
||||||
|
@Expose
|
||||||
private Double kiloBytesReceivedPerSecond;
|
private Double kiloBytesReceivedPerSecond;
|
||||||
|
@Expose
|
||||||
private Double kiloBytesSentPerSecond;
|
private Double kiloBytesSentPerSecond;
|
||||||
private long interval = 500;
|
private long interval = 500;
|
||||||
private Logger logger = Logger.getLogger(NetworkInterfaceModel.class);
|
|
||||||
|
/* private Logger logger = Logger.getLogger(NetworkInterfaceModel.class); */
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
while (true) {
|
while (true) {
|
||||||
long Time = System.currentTimeMillis();
|
long Time = System.currentTimeMillis();
|
||||||
NetworkInterfaceModel test = new NetworkInterfaceModel();
|
NetworkInterfaceModel test = new NetworkInterfaceModel();
|
||||||
|
|
||||||
test.logger.info("ll");
|
|
||||||
System.out.println("KiloBytesReceivedPerSecond:"
|
System.out.println("KiloBytesReceivedPerSecond:"
|
||||||
+ test.getKiloBytesReceivedPerSecond() + "kb/s");
|
+ test.getKiloBytesReceivedPerSecond() + "kb/s");
|
||||||
System.out.println("KiloBytesSentPerSecond:"
|
System.out.println("KiloBytesSentPerSecond:"
|
||||||
|
@ -38,9 +43,18 @@ public class NetworkInterfaceModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MonitorMain monitorMain;
|
||||||
|
|
||||||
|
public NetworkInterfaceModel(MonitorMain monitorMain) {
|
||||||
|
this.monitorMain = monitorMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
monitorMain.setNetworkInterfaceModel(new NetworkInterfaceModel());
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public NetworkInterfaceModel() {
|
public NetworkInterfaceModel() {
|
||||||
logger.error("hello");
|
|
||||||
// this can be used for all
|
// this can be used for all
|
||||||
ExecutorService executorService = Executors.newFixedThreadPool(2);
|
ExecutorService executorService = Executors.newFixedThreadPool(2);
|
||||||
|
|
||||||
|
@ -50,7 +64,6 @@ public class NetworkInterfaceModel {
|
||||||
Future<Double> futureBytesSentPerSecond = executorService
|
Future<Double> futureBytesSentPerSecond = executorService
|
||||||
.submit(new CalculateBytesSentPerSecond(interval));
|
.submit(new CalculateBytesSentPerSecond(interval));
|
||||||
try {
|
try {
|
||||||
System.out.println(futureBytesReceivedPerSecond.get());
|
|
||||||
|
|
||||||
this.setKiloBytesReceivedPerSecond(futureBytesReceivedPerSecond
|
this.setKiloBytesReceivedPerSecond(futureBytesReceivedPerSecond
|
||||||
.get());
|
.get());
|
||||||
|
@ -121,7 +134,7 @@ abstract class CalculateBytesPerSecond implements Callable {
|
||||||
postBytesSentSoFar = this.getBytesSoFar();
|
postBytesSentSoFar = this.getBytesSoFar();
|
||||||
this.kiloBytesPerSecond = (double) ((postBytesSentSoFar - preBytesSentSoFar)
|
this.kiloBytesPerSecond = (double) ((postBytesSentSoFar - preBytesSentSoFar)
|
||||||
/ DataFomat.caculateTimeInterval(startTime, endTime) / 1024L);
|
/ DataFomat.caculateTimeInterval(startTime, endTime) / 1024L);
|
||||||
return new Double(Math.round(this.kiloBytesPerSecond*100)/100);
|
return new Double(Math.round(this.kiloBytesPerSecond * 100) / 100);
|
||||||
} catch (SigarException e) {
|
} catch (SigarException e) {
|
||||||
logger.error(e, e.fillInStackTrace());
|
logger.error(e, e.fillInStackTrace());
|
||||||
return new Double(0);
|
return new Double(0);
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
import org.bench4q.monitor.service.GetSigar;
|
import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.bench4q.monitor.service.GetThreadPool;
|
import org.bench4q.monitor.service.GetThreadPool;
|
||||||
import org.hyperic.sigar.Sigar;
|
import org.hyperic.sigar.Sigar;
|
||||||
|
@ -19,21 +20,31 @@ import org.hyperic.sigar.FileSystem;
|
||||||
import org.hyperic.sigar.FileSystemUsage;
|
import org.hyperic.sigar.FileSystemUsage;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class PhysicalDiskModel {
|
public class PhysicalDiskModel implements Runnable{
|
||||||
|
@Expose
|
||||||
private Double diskReadKBytesRate;
|
private Double diskReadKBytesRate;
|
||||||
|
@Expose
|
||||||
private Double diskWriteKBytesRate;
|
private Double diskWriteKBytesRate;
|
||||||
|
@Expose
|
||||||
private double curDiskQueLength;
|
private double curDiskQueLength;
|
||||||
|
@Expose
|
||||||
private double totalGB;
|
private double totalGB;
|
||||||
|
@Expose
|
||||||
private double usedGB;
|
private double usedGB;
|
||||||
|
@Expose
|
||||||
private double freeGB;
|
private double freeGB;
|
||||||
|
@Expose
|
||||||
private double usedPercent;
|
private double usedPercent;
|
||||||
|
@Expose
|
||||||
private List<FileSystemModel> fieFileSystemModels;
|
private List<FileSystemModel> fieFileSystemModels;
|
||||||
private Sigar sigar = GetSigar.getSigar();
|
private Sigar sigar = GetSigar.getSigar();
|
||||||
private FileSystem[] fileSystemList;
|
private FileSystem[] fileSystemList;
|
||||||
private final int interval = 500;
|
private final int interval = 500;
|
||||||
|
private MonitorMain monitorMain;
|
||||||
// private Logger logger = Logger.getLogger(PhysicalDiskModel.class);
|
private Logger logger = Logger.getLogger(PhysicalDiskModel.class);
|
||||||
|
|
||||||
public static void main(String[] args) throws SigarException,
|
public static void main(String[] args) throws SigarException,
|
||||||
InterruptedException, ExecutionException {
|
InterruptedException, ExecutionException {
|
||||||
|
@ -50,7 +61,25 @@ public class PhysicalDiskModel {
|
||||||
System.out.println("total:" + physicalDiskModel.getTotalGB());
|
System.out.println("total:" + physicalDiskModel.getTotalGB());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public PhysicalDiskModel(MonitorMain monitorMain) {
|
||||||
|
this.monitorMain = monitorMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
monitorMain.setPhysicalDiskModel(new PhysicalDiskModel());
|
||||||
|
} catch (SigarException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
public PhysicalDiskModel() throws SigarException, InterruptedException,
|
public PhysicalDiskModel() throws SigarException, InterruptedException,
|
||||||
ExecutionException {
|
ExecutionException {
|
||||||
|
|
||||||
|
|
|
@ -10,18 +10,25 @@ import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
import org.bench4q.monitor.service.GetSigar;
|
import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.bench4q.monitor.service.GetThreadPool;
|
import org.bench4q.monitor.service.GetThreadPool;
|
||||||
import org.hyperic.sigar.ProcState;
|
import org.hyperic.sigar.ProcState;
|
||||||
import org.hyperic.sigar.Sigar;
|
import org.hyperic.sigar.Sigar;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class ProcessModel {
|
public class ProcessModel implements Runnable {
|
||||||
private Sigar sigar = GetSigar.getSigar();
|
private Sigar sigar = GetSigar.getSigar();
|
||||||
|
@Expose
|
||||||
private List<ProcessModelChild> processModelList;
|
private List<ProcessModelChild> processModelList;
|
||||||
|
@Expose
|
||||||
private long[] processPids;
|
private long[] processPids;
|
||||||
|
@Expose
|
||||||
private List<String> processNameList;
|
private List<String> processNameList;
|
||||||
|
@Expose
|
||||||
private int size;
|
private int size;
|
||||||
|
|
||||||
public static void main(String args[]) throws SigarException,
|
public static void main(String args[]) throws SigarException,
|
||||||
|
@ -47,10 +54,9 @@ public class ProcessModel {
|
||||||
.getResidentKBytes());
|
.getResidentKBytes());
|
||||||
System.out.println("virtural Kbytes:"
|
System.out.println("virtural Kbytes:"
|
||||||
+ processModel.getProcessModelList().get(i).getVSize());
|
+ processModel.getProcessModelList().get(i).getVSize());
|
||||||
System.out
|
System.out.println(" Kbytes:"
|
||||||
.println(" Kbytes:"
|
+ processModel.getProcessModelList().get(i)
|
||||||
+ processModel.getProcessModelList().get(i)
|
.getMemSize());
|
||||||
.getMemSize());
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -61,6 +67,29 @@ public class ProcessModel {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MonitorMain monitorMain;
|
||||||
|
private Logger logger = Logger.getLogger(ProcessModel.class);
|
||||||
|
|
||||||
|
public ProcessModel(MonitorMain monitorMain) {
|
||||||
|
this.monitorMain = monitorMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
monitorMain.setProcesssModel(new ProcessModel());
|
||||||
|
} catch (SigarException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public ProcessModel() throws SigarException, InterruptedException,
|
public ProcessModel() throws SigarException, InterruptedException,
|
||||||
ExecutionException {
|
ExecutionException {
|
||||||
this.setProcessPids();
|
this.setProcessPids();
|
||||||
|
@ -79,7 +108,7 @@ public class ProcessModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
@XmlElementWrapper()
|
@XmlElementWrapper()
|
||||||
@XmlElement( type = ProcessModelChild.class)
|
@XmlElement(type = ProcessModelChild.class)
|
||||||
public List<ProcessModelChild> getProcessModelList() {
|
public List<ProcessModelChild> getProcessModelList() {
|
||||||
return processModelList;
|
return processModelList;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +131,8 @@ public class ProcessModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@XmlElement
|
|
||||||
|
@XmlElement
|
||||||
public long[] getProcessPids() {
|
public long[] getProcessPids() {
|
||||||
return processPids;
|
return processPids;
|
||||||
}
|
}
|
||||||
|
@ -120,8 +150,11 @@ public class ProcessModel {
|
||||||
private void setProcessNameList() throws SigarException {
|
private void setProcessNameList() throws SigarException {
|
||||||
this.processNameList = new ArrayList<String>();
|
this.processNameList = new ArrayList<String>();
|
||||||
for (long pid : this.getProcessPids()) {
|
for (long pid : this.getProcessPids()) {
|
||||||
ProcState procState = sigar.getProcState(pid);
|
try {
|
||||||
processNameList.add(procState.getName());
|
ProcState procState = sigar.getProcState(pid);
|
||||||
|
processNameList.add(procState.getName());
|
||||||
|
} catch (SigarException e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,21 @@ import org.hyperic.sigar.ProcMem;
|
||||||
import org.hyperic.sigar.ProcState;
|
import org.hyperic.sigar.ProcState;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class ProcessModelChild {
|
public class ProcessModelChild {
|
||||||
|
@Expose
|
||||||
private String instanceString;
|
private String instanceString;
|
||||||
|
@Expose
|
||||||
private long residentKBytes;
|
private long residentKBytes;
|
||||||
|
@Expose
|
||||||
private double processorTimePercent;
|
private double processorTimePercent;
|
||||||
|
@Expose
|
||||||
private long memSize;
|
private long memSize;
|
||||||
|
@Expose
|
||||||
private long processId;
|
private long processId;
|
||||||
|
@Expose
|
||||||
private long vSize;
|
private long vSize;
|
||||||
private ProcessSigarReleatedModel processSigarReleatedModel;
|
private ProcessSigarReleatedModel processSigarReleatedModel;
|
||||||
|
|
||||||
|
|
|
@ -19,18 +19,27 @@ import org.hyperic.sigar.Sigar;
|
||||||
import org.hyperic.sigar.CpuPerc;
|
import org.hyperic.sigar.CpuPerc;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class ProcessorModel {
|
public class ProcessorModel implements Runnable {
|
||||||
private List<ProcessorModelChild> processorModelList;
|
private List<ProcessorModelChild> processorModelList;
|
||||||
private Sigar sigar = GetSigar.getSigar();
|
private Sigar sigar = GetSigar.getSigar();
|
||||||
private CpuPerc cpuPerc;
|
private CpuPerc cpuPerc;
|
||||||
|
@Expose
|
||||||
private double processorTimePercent;
|
private double processorTimePercent;
|
||||||
|
@Expose
|
||||||
private double privilegedTimePercent;
|
private double privilegedTimePercent;
|
||||||
|
@Expose
|
||||||
private double userTimePercent;
|
private double userTimePercent;
|
||||||
|
@Expose
|
||||||
private double speed;
|
private double speed;
|
||||||
|
@Expose
|
||||||
private List<String> cpuInstanceList;
|
private List<String> cpuInstanceList;
|
||||||
|
@Expose
|
||||||
private int size;
|
private int size;
|
||||||
private Logger logger = Logger.getLogger(ProcessModelChild.class);
|
private MonitorMain monitorMain;
|
||||||
|
private Logger logger = Logger.getLogger(ProcessorModel.class);
|
||||||
|
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
try {
|
try {
|
||||||
|
@ -52,6 +61,20 @@ public class ProcessorModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProcessorModel(MonitorMain monitorMain) {
|
||||||
|
this.monitorMain = monitorMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
monitorMain.setProcessorModel(new ProcessorModel());
|
||||||
|
} catch (SigarException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
logger.info(e, e.fillInStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public ProcessorModel() throws SigarException {
|
public ProcessorModel() throws SigarException {
|
||||||
|
|
||||||
cpuPerc = sigar.getCpuPerc();
|
cpuPerc = sigar.getCpuPerc();
|
||||||
|
@ -154,10 +177,10 @@ public class ProcessorModel {
|
||||||
try {
|
try {
|
||||||
processorModelList.add(future.get());
|
processorModelList.add(future.get());
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
logger.info(e, e.fillInStackTrace());
|
e.printStackTrace();
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
logger.info(e, e.fillInStackTrace());
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,17 @@ import org.bench4q.monitor.service.GetSigar;
|
||||||
import org.hyperic.sigar.CpuPerc;
|
import org.hyperic.sigar.CpuPerc;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class ProcessorModelChild {
|
public class ProcessorModelChild {
|
||||||
|
@Expose
|
||||||
private String instance;
|
private String instance;
|
||||||
|
@Expose
|
||||||
private double processorTimePercent;
|
private double processorTimePercent;
|
||||||
|
@Expose
|
||||||
private double userTimePercent;
|
private double userTimePercent;
|
||||||
|
@Expose
|
||||||
private double privilegedTimePercent;
|
private double privilegedTimePercent;
|
||||||
private CpuPerc cpuPerc;
|
private CpuPerc cpuPerc;
|
||||||
public static void main(String[] agrs) throws SigarException {
|
public static void main(String[] agrs) throws SigarException {
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
package org.bench4q.monitor.service;
|
package org.bench4q.monitor.service;
|
||||||
|
|
||||||
|
|
||||||
import org.hyperic.sigar.Sigar;
|
import org.hyperic.sigar.Sigar;
|
||||||
|
|
||||||
public class GetSigar{
|
|
||||||
|
|
||||||
private static Sigar sigar = new Sigar();
|
public class GetSigar {
|
||||||
|
public static Sigar sigar;
|
||||||
|
|
||||||
public static Sigar getSigar() {
|
public static Sigar getSigar() {
|
||||||
|
sigar = new Sigar();
|
||||||
return sigar;
|
return sigar;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.bench4q.monitor.service;
|
package org.bench4q.monitor.service;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
@ -22,6 +23,9 @@ public class TimerService extends TimerTask {
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
} catch (SigarException e) {
|
} catch (SigarException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
|
|
|
@ -4,46 +4,45 @@ import java.util.Date;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
import javax.xml.bind.JAXBContext;
|
|
||||||
import javax.xml.bind.Marshaller;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
import org.bench4q.monitor.model.*;
|
import org.bench4q.monitor.model.*;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
public class WriteSystemInfoToLocalDisk {
|
public class WriteSystemInfoToLocalDisk {
|
||||||
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
|
private SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd-HH-mm-ss");
|
||||||
private String savePath;
|
private String savePath;
|
||||||
|
private Logger logger = Logger.getLogger(WriteSystemInfoToLocalDisk.class);
|
||||||
//test code
|
|
||||||
public static void main(String[] args) throws SigarException, InterruptedException, ExecutionException{
|
public static void main(String[] args) throws SigarException,
|
||||||
|
InterruptedException, ExecutionException, IOException {
|
||||||
WriteSystemInfoToLocalDisk testWrite = new WriteSystemInfoToLocalDisk();
|
WriteSystemInfoToLocalDisk testWrite = new WriteSystemInfoToLocalDisk();
|
||||||
testWrite.setSavaPath("D:/sigartmp/");
|
testWrite.setSavaPath("D:/sigartmp/");
|
||||||
testWrite.writeCurrentSystemInfoToLocalDisk();
|
testWrite.writeCurrentSystemInfoToLocalDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSavaPath(String savePath){
|
public void setSavaPath(String savePath) {
|
||||||
this.savePath = savePath;
|
this.savePath = savePath;
|
||||||
}
|
}
|
||||||
public void writeCurrentSystemInfoToLocalDisk() throws SigarException, InterruptedException, ExecutionException{
|
|
||||||
|
public void writeCurrentSystemInfoToLocalDisk() throws SigarException,
|
||||||
|
InterruptedException, ExecutionException, IOException {
|
||||||
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
|
dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
|
||||||
Date date = new Date();
|
Date date = new Date();
|
||||||
MonitorMain mainModel = new MonitorMain(date);
|
MonitorMain mainModel = new MonitorMain(date);
|
||||||
FileWriter writer = null;
|
FileWriter writer = null;
|
||||||
|
try {
|
||||||
try {
|
writer = new FileWriter(savePath + dateFormat.format(date)
|
||||||
|
+ ".json");
|
||||||
JAXBContext context = JAXBContext.newInstance(MonitorMain.class);
|
Gson gson = new GsonBuilder()
|
||||||
Marshaller marshal = context.createMarshaller();
|
.excludeFieldsWithoutExposeAnnotation().create();
|
||||||
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
|
gson.toJson(mainModel, writer);
|
||||||
marshal.marshal(mainModel, System.out);
|
} catch (Exception e) {
|
||||||
writer = new FileWriter(savePath + dateFormat.format(date) + ".xml");
|
logger.error(e, e.fillInStackTrace());
|
||||||
marshal.marshal(mainModel, writer);
|
} finally {
|
||||||
} catch (Exception e) {
|
writer.close();
|
||||||
e.printStackTrace();
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue