【发布时间】:2014-08-23 05:21:03
【问题描述】:
我想为部署在 Google App Engine 中的应用程序实现消息队列 (F.I.F.O)。该应用程序使用 JDO 访问 Google DataStore。我公开了一个可以从任何移动设备调用的 REST API。下图应该清楚地表明我想要实现的目标。
移动设备池调用 REST API 将消息排入队列。消息实体包含创建时间戳和消息状态字段。消息状态最初设置为活动。另一个移动设备池将调用 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;
}
【问题讨论】:
标签: google-app-engine jdo google-cloud-datastore