2013年10月23日 星期三

[技術筆記] SNMP 吃記憶體 (snmp4j)

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月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





















終焉に咲く花-Asriel