gpt4 book ai didi

java - JMS 队列场景所需的建议

转载 作者:行者123 更新时间:2023-11-29 09:10:10 26 4
gpt4 key购买 nike

JMS 队列场景所需的建议

您好,我是 Java EE 和应用程序服务器的新手,我想知道 JMS 队列(或 ActiveMQ?)解决方案是否适合我的场景。现在我不这么认为,但似乎有很多我可能不知道的选项。

我有一个可以访问项目(数据库中的数据)的客户端应用程序,并将锁定该项目直到客户端完成。如果客户不关闭应用程序,他可能会锁定项目很多天。

我需要开发一个 web 服务,它将发布到队列操作,以在项目上完成。 困难的部分是如果这个项目当前被锁定,这些操作需要暂停。(而且我不知道什么时候锁定被释放;所以我可能需要一个计时器将尝试使这些操作出队)。

所以如果项目A当前被锁定,我的队列可能看起来像这样:

  1. 将数据 XXX 添加到项目 A
  2. 将数据 ZZZ 添加到项目 B
  3. 更新项目 A 的数据 XXX
  4. 更新项目B的数据ZZZ
  5. 删除项目 B 的数据 ZZZ

如果 A 被锁定,我需要能够继续处理 B(或任何其他未锁定的项目)上的操作,并在其锁定被释放后处理项目 A。

我考虑过为每个具有待处理操作的项目创建内存 JMS 队列以保留其顺序)但我不能(也不应该),因为队列将由 App Server 定义。而且我显然需要持久队列(所以没有临时队列?)

JMS 队列是否适合这种情况?ActiveMQ 或其他实现有帮助吗?

我是否必须在计时器上使用自己的队列/SQL 表/EJB 进行编码?

最佳答案

JMS 和其他方法都有很多选择。

但这里是我对使用 JMS(ActiveMQ 或诸如此类)的一种可能解决方案的想法:

您可以有一个 JMS 队列用于接收消息,一个队列用于等待消息(等待在某个锁定的项目上处理)。希望您也有一些 ID(我称之为“projectId”,以标识锁定的项目)。我还假设您可以在项目发布时执行代码。

这里是一些伪代码,你可以如何思考,同时使用队列实现这个场景。

public void onMessage(Message msg){
ProjData pd = extractProjectData(msg);
if( projectLocked(pd) ) {
msg.setStringProperty("projectId",pd.getProjectId());
sendToOnHoldQueue(pd);
}else{
processProjectData(pd);
}
}

// Say there is an event somewhere when the lock is released
public void onProjectLockReleased(projectId){
// select messages waiting for this project via Jms selectors..

// you may or may not want to lock the project here, while working of the "on hold events"
MessageConsumer consumer = session.createConsumer(onHoldQueue,"projectId='"+projectId+"'");
while(Messages msg = consumer.receiveNoWait()){
processProjectData(pd);
}
}

关于java - JMS 队列场景所需的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com