我想为部署在Google App Engine中的应用程序实现消息Queue(F.I.F.O)。该应用程序使用JDO访问Google DataStore。我公开了一个可以从任何移动设备调用的REST API。下图应该清楚地表明我想要实现的目标。
移动设备池调用REST API以将消息入队到队列中。 Message实体包含创建时间戳和消息状态字段。消息状态最初设置为ACTIVE。另一个移动设备池将调用REST API来获取消息。此时,查询数据存储区以查找以创建时间戳的升序排序的ACTIVE消息。然后将消息状态设置为DELIVERED,并将消息返回给设备。
然后是来自消费者设备的并发请求时出现问题。多个设备接收相同的消息。
我有一个模型类消息
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;
@Persistent
private String message;
@Persistent
private Date created;
@Persistent
private MessageStatus status;
MessageStatus枚举具有以下雕像
public enum MessageStatus {
ACTIVE, DELIVERED, ACKNOWLEDGED
}
我有一个数据访问类MessageDAO
public Message fetchMessage() {
PersistenceManager pm = PMF.get().getPersistenceManager();
Message message = null;
Transaction transaction = null;
try {
transaction = pm.currentTransaction();
transaction.setIsolationLevel(Constants.TX_READ_COMMITTED);
transaction.begin();
Query query = pm.newQuery(Message.class);
query.setFilter("status == 'ACTIVE'");
query.setOrdering("created asc");
List<Message> messageList = (List<Message>) query.execute();
if (messageList != null && !messageList.isEmpty()) {
message = messageList.get(0);
message.setStatus(MessageStatus.DELIVERED);
}
transaction.commit();
} finally {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
pm.close();
}
return message;
}
答案 0 :(得分:0)
您似乎长时间轮询来自设备的消息。如果是这种情况,那么使用任务队列就没有任何实际价值。队列更适用于要执行的作业/业务处理。
您应该只拥有端点,并使用您拥有的最后一条消息的时间戳来调用服务器。然后,每个设备都将从数据存储区中的查询中检索完全相同的结果集。 Memcache将帮助配额。
您可以参考Dropbox的用途,他们使用他们发送的增量令牌来接收一组任何新的文件夹/文件更改。