2

我从事一个为移动应用程序提供服务的项目,并且我应该制作一个监控移动项目的项目。我想制作一些报告来显示此时有多少消息以及其他一些类似的报告。

但我不想直接从数据库中获取监控项目中的查询。我想在内存中创建一个临时数据持有者并在其上保存最后 10 分钟的数据(如变量或列表),但我不知道技术上如何?我在我的项目中使用 Spring 和 Hibernate。

4

2 回答 2

2

首先,我们假设我们的程序每 10 分钟尝试刷新一个名为SampleEntity的实体的报告。这只是一个简单的 POJO。

public class SampleEntity
{
    // your fields and their getters and setters
}

接下来我们有一个类,我称之为SampleEntityDA,它从 db 查询我们的报告所需的记录。当您使用休眠时,您可以简单地将结果返回为 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 分钟从 db 查询一次...

要每 10 分钟从 db 查询一次,您可以简单地使用 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 分钟更新一次报告的数据持有者。

您可以通过观察者模式简单地做到这一点。正如您在 java 中所知道的,这是由 Observer 类和 Observable 接口完成的。所以 1) ReportTimer 需要扩展 Observer 类 2) 在 TimerTask 中我们需要通知监听器;这是通过 notifyObservers 方法完成的。

我们最后一堂课有刷新报告的职责。我称之为报告生成器。此类可随时刷新报告。它还有一个 java.util.List 字段,其中包含 db 的最新数据。每当其观察者(我的意思是 ReportTimer)通知它时,ReportGenerator 都会更新此字段。

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
}
}
于 2013-04-21T13:50:38.790 回答
1

使用 map、hashMap 或 ConcurrentHashMap。做一个十分钟后更新地图的工作。

这是 mapHashMapConcurrentHashMAP的链接

于 2013-04-20T12:42:00.193 回答