2013-07-11 52 views
1

我希望能够在登录页面上显示新闻。 (例如引起服务器维护等的停机时间)缓存新闻刷新10 miunte周期

这个消息将来自DB加载。但是,由于消息很少会发生变化,因此应该是缓存,并且每次加载应用程序时都不会加载。

这里是我被困住的地方:如何缓存消息?另外,我想从DB每10分钟加载一次消息,否则从缓存中加载。这可能吗?

或者,也许你可以推荐我一个更好的soultion。

非常感谢提前。

Leostiw

回答

0

如果你想存储跨页,你可以使用@SessionScoped bean保存数据为目的的数据。
您可以使用Cookie在多个会话之间存储数据。
至于请求DB每隔10分钟关注..,
通常一个将发送Ajax调用每隔10分钟,而不是您可以使用PRIEMFACE的PRIME PUSH技术[Link]
这是基于反向ajax技术构建的,其中在更新数据时将发送反向ajax调用以从Managed bean更新JSF组件。
您可以使用数据库触发器。

编辑: 由于Luiggi Mendoza在下面的评论中建议使用@ApplicationScope将解决这个问题。

+0

感谢您的回答!在范围内,我不想跨页面存储数据,我只需要将消息加载一次/会话,即登录。在处理登录后,我不再需要这个消息。实际上我使用** @ RequestScoped ** bean。但这不是我的主要观点。每次创建会话时,我都不想访问数据库。该消息应该从缓存中加载。缓存应该每10分钟更新一次。关于** primefaces推**,我不认为我可以用这个purpouse,对吧? (session independent) – leostiw

+0

@leostiw我不会推荐使用'@SessionScoped',因为消息应该可用于应用程序中的所有用户,并且不需要在每次新会话开始时恢复。你可以使用'@ ApplicationScoped'来存储新闻,甚至更好,使用像[ehcache](http://stackoverflow.com/q/14712626/1065197)或[infinispan](http:// www。jboss.org/infinispan/)来存储和检索你的'@ ViewScoped'托管bean的新闻。 –

+0

@LuiggiMendoza谢谢你的答案!在这种情况下,我将使用'@ ApplicationScoped' bean。有一个问题,在这种情况下将存储的数据在哪里?重新加载周期,我应该使用线程,你会推荐什么? – leostiw

0

最后我决定做刷新周期支持波谷EJB计时器服务

这是我的解决方案:

@ApplicationScoped豆(NewsController)

@ApplicationScoped 
public class NewsController extends BaseController implements Serializable { 
private static final long serialVersionUID = 1L; 

@PersistenceContext 
protected EntityManager em; 

private List<News> newsList; 

public NewsController() { 
} 

@PostConstruct 
public void init() throws ExecutionException { 
    getAvailableNews(); 
} 

public void getAvailableNews() { 
    if (newsList == null) { 
     newsList = new LinkedList<News>(); 
     Query q = em.createNativeQuery(
       "SELECT * FROM news WHERE sysdate BETWEEN ab AND bis+1", 
       News.class); 
     @SuppressWarnings("unchecked") 
     List<News> result = q.getResultList(); 
     for (News n : result) 
      newsList.add(n); 
    } 
} 

public List<News> getNewsList() { 
    return newsList; 
} 

public void setNewsList(List<News> newsList) { 
    this.newsList = newsList; 
} 

} 

我addede另外一个@Stateless豆(NewsScheduler)这就要求我getAvailableNews()每10新闻控制器中的miuntes:

@Stateless 
public class NewsScheduler { 

@Inject 
NewsController newsController; 

@Schedule(hour = "*", minute = "*/5") 
public void reload() { 
    System.out.println("---------------- Laden der News aus der DB --------------"); 
    newsController.setNewsList(null); 
    newsController.getAvailableNews(); 
} 

}