2

我正在使用长轮询开发“某种”聊天应用程序。

我正在使用 Play Framework 1.2.5,并且正在尝试处理多个对话,将其信息存储在使用 JPA 的数据库中。

为了收听每个事件并将其发布到聊天中(有人加入、离开或发短信),我使用了 ArchivedEventStream<Event> 类型的对象,但由于该对象不是实体,Play Framework 找不到在数据库中适合他的类型。

目前,我制作了一个静态 HashMap,其中每个对话的模型 id 作为键,我的 ArchivedEventStream 对象带有事件。我在其中添加了@Transient 注释,以便不将我的 Map 计入数据库并规避错误。

@Transient
public final static HashMap<Long, ArchivedEventStream<PlayEvent>> playEvents =  new HashMap<Long, F.ArchivedEventStream<PlayEvent>>();

它暂时有效,许多人可以按照自己的流量使用自己的对话,但过了一段时间,服务器会破坏这个静态变量,产生一些 NullPointerExceptions。

有没有办法将此对象存储到我的数据库中,以便每次对话都可以访问它?

或者,我可以阻止我的服务器 Play 破坏我的变量吗?

甚至,还有其他更好的选择来解决这个问题吗?

非常感谢。

4

1 回答 1

0

使用 Play 存储状态的最佳方式是在缓存中。但是,这并不能保证您的事件将始终可用(服务器重新启动,ttl...)

如果您需要这些事件永久可用,您将需要将它们保存到数据库中。您可以获取 ArchivedEventStream 实现模型,将它们存储在缓存中,并在缓存未命中时从数据库中检索它们。

于 2013-04-24T06:28:47.717 回答