我致力于为移动应用程序提供服务的项目 我应该制作一个监控移动项目的项目。 我想制作一些报告,显示此刻有多少消息 以及其他类似的报道。
但我不想直接从DB监视项目中获取查询。 我想在内存中创建一个临时数据持有者并保存最后10分钟 它上的数据(如变量或列表) 但我不知道技术上怎么样? 我在项目中使用Spring和Hibernate。
答案 0 :(得分:2)
首先,我们假设我们的程序每10分钟尝试刷新一个名为 SampleEntity 的实体的报告。这只是一个简单的POJO。
public class SampleEntity
{
// your fields and their getters and setters
}
接下来我们有一个类,我称之为 SampleEntityDA ,它从db查询我们报告所需的记录。 当您使用hibernate时,您只需将结果返回为java.util.List (我认为这是您的主要问题之一)。
public class SampleEntityDA
{
public List<SampleEntity> queryFromDB()
{
// fetch records you need for your reports here
Session session = ...
return session.createQuery("from sampleEntity").list();
}
}
最后......
每10分钟从数据库中查询 ...
要每10分钟从数据库进行一次查询,您只需使用java.util.Timer类。
public class ReportTimer extends Observable
{
private Timer timer;
public static void main(String[] args)
{
// Your program starts from here
new ReportTimer().start();
}
private void start()
{
// schedule method of Timer class can execute a task repeatedly.
// This method accepts a TimerTask interface instance as its first parameter.I implement
// it as an anonymous class. TimerTask interface has a run method. Code in this method will execute repeatedly.
// Its second parameter is delay before task gets started to execute.
// And its third parameter is the interval between each execution(10min in your case)
timer = new Timer();
timer.schedule(
new TimerTask()
{
@Override
public void run()
{
notifyObservers(
new SampleEntityDA().queryFromDB() // 10 minutes passed from the last query, now its time to query from db again...
);
}
}, 100, 600000); // 600000ms = 10min
}
public void finish()
{
// call me whenever you get tired of refreshing reports
timer.cancel();
}
}
最后,您需要每10分钟更新一次报告的数据持有者。
您只需通过 Observer Pattern 即可完成此操作。正如您在java中所知,这是由Observer类和Observable接口完成的。 所以1)ReportTimer需要扩展Observer类和2)在TimerTask中我们需要通知监听器;这是通过notifyObservers方法完成的。
我们上一堂课有责任提醒报告。我称之为ReportGenerator。此课程可以随时刷新报告。它还有一个java.util.List字段,其中包含db的最新数据。 ReportGenerator会在其Observer - 我的意思是ReportTimer - 通知它时更新此字段。
public class ReportGenerator implements Observer
{
List<SampleEntity> list = new ArrayList<SampleEntity>();
@Override
public void update(Observable o, Object arg)
{
// This method will automatically!?! executed whenever its observer notifies him.
// The arg parameter consists the new records. you just need to put it in the list field.
List<SampleEntity> list = (List<SampleEntity>) arg;
}
public void refreshReport()
{
// you can easily refresh a report with data in list field
}
public void refreshAnotherReport()
{
// you can easily refresh a report with data in list field
}
}
答案 1 :(得分:1)
使用map,hashMap或ConcurrentHashMap。 做一个在10分钟后更新Map的cron作业。
的链接