public class TestSnmp{
TransportMapping transport;
(下略五千字)
public void go(){
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
}
}
TestSnmp testSnmp = new TestSnmp();
(略)
testSnmp.go;
這時候就算你把snmp.close()、你狠一點把 testSnmp=null 都沒用
該死的transport的參考還會在,記憶體就會被一直吃,
使用snmp4j時,除了snmp.close(),千萬要記得把那個transport.close()
2013年10月23日 星期三
2013年10月16日 星期三
Java 排程工具、定時執行Class的好工具:Quartz
使用 quartz-all-2.1.0.jar
另外還需要commons-logging-1.1.1.jar 這一類的包,因為Quartz用的logeer是這個
原理:建立Scheduler,建立一個指定要定時工作的Class以及日期參數(類似CRONTAB)的Job,建立 Trigger,將Job與Trigger與Scheduler綁定,至於進階的Group跟Trigger那些沒用的很深,就不研究了。
時間到了Quartz會很聰明的執行你指定的Class,Class本身要實作Quartz的Job介面
範例:
極重要!務必在你要新建Quartz的CLASS裡面加入這行
如果你想被洗版的話例外... Logger.getLogger("org.quartz").setLevel(Level.INFO);
Scheduler sched; public void initAJob{
try {
//建立一個Scheduler
SchedulerFactory sf = new StdSchedulerFactory();
sched = sf.getScheduler();
JobDetail job = newJob(PollingWorker.class).withIdentity( "JobA","JobAGroup").build();
//如果在工作執行時,需要傳入變數或物件,可以使用getJobDataMap()方法放東西進去
job.getJobDataMap().put("param", param);
job.getJobDataMap().put("connectionPool", connectionPool);
CronTrigger trigger = newTrigger().withIdentity("JobATrigger", "JobAGroup")
.withSchedule(cronSchedule("0 11 0 * * ?")).build();
//將Job與Trigger放入scheduler
Date ft = sched.scheduleJob(job, trigger);
System.out.println(job.getKey() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
//執行就可以了
sched.start();
} catch (Exception ex) {
//do something
}
}
-----------------
PollingWorker.class
public class PollingWorker implements Job { //必須實作Job 介面
//我自己用到的變數
NDSExternalPolling NDSEP;
Param param;
ConnectionPool connectionPool;
public PollingWorker() {
}
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
//拿傳入變數只要這樣拿出來再轉型就可以了
JobDataMap dataMap = jec.getJobDetail().getJobDataMap();
param = (Param) dataMap.get("param");
connectionPool = (ConnectionPool)dataMap.get("connectionPool");
//do something
}
}
----
簡易時間參數說明
"0 11 0 * * ?" 每天零點11分執行,不限月日
"0 47 0/2 * * ?" 每兩小時(從0點開始算:0,2,4,6,8~22) 的47分時執行,不限月日
"0 3/10 * * * ?" 每10分鐘執行一次(從3分開始算:3,13,23,33,43,53)
更進階的自己GOOGLE
另外還需要commons-logging-1.1.1.jar 這一類的包,因為Quartz用的logeer是這個
原理:建立Scheduler,建立一個指定要定時工作的Class以及日期參數(類似CRONTAB)的Job,建立 Trigger,將Job與Trigger與Scheduler綁定,至於進階的Group跟Trigger那些沒用的很深,就不研究了。
時間到了Quartz會很聰明的執行你指定的Class,Class本身要實作Quartz的Job介面
範例:
極重要!務必在你要新建Quartz的CLASS裡面加入這行
如果你想被洗版的話例外... Logger.getLogger("org.quartz").setLevel(Level.INFO);
Scheduler sched; public void initAJob{
try {
//建立一個Scheduler
SchedulerFactory sf = new StdSchedulerFactory();
sched = sf.getScheduler();
JobDetail job = newJob(PollingWorker.class).withIdentity( "JobA","JobAGroup").build();
//如果在工作執行時,需要傳入變數或物件,可以使用getJobDataMap()方法放東西進去
job.getJobDataMap().put("param", param);
job.getJobDataMap().put("connectionPool", connectionPool);
CronTrigger trigger = newTrigger().withIdentity("JobATrigger", "JobAGroup")
.withSchedule(cronSchedule("0 11 0 * * ?")).build();
//將Job與Trigger放入scheduler
Date ft = sched.scheduleJob(job, trigger);
System.out.println(job.getKey() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
//執行就可以了
sched.start();
} catch (Exception ex) {
//do something
}
}
-----------------
PollingWorker.class
public class PollingWorker implements Job { //必須實作Job 介面
//我自己用到的變數
NDSExternalPolling NDSEP;
Param param;
ConnectionPool connectionPool;
public PollingWorker() {
}
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
//拿傳入變數只要這樣拿出來再轉型就可以了
JobDataMap dataMap = jec.getJobDetail().getJobDataMap();
param = (Param) dataMap.get("param");
connectionPool = (ConnectionPool)dataMap.get("connectionPool");
//do something
}
}
----
簡易時間參數說明
"0 11 0 * * ?" 每天零點11分執行,不限月日
"0 47 0/2 * * ?" 每兩小時(從0點開始算:0,2,4,6,8~22) 的47分時執行,不限月日
"0 3/10 * * * ?" 每10分鐘執行一次(從3分開始算:3,13,23,33,43,53)
更進階的自己GOOGLE
訂閱:
文章 (Atom)