在纯技术层面上,这可能是一个好点开始:http://java.sun.com/products/jms/tutorial/
你也绝对应该拿到书的副本,“企业集成模式”这解释了所有可以使用的排队系统中的各种方式。
从你的描述,我设想了以下模式是有用的(对不起,不知道在书中所使用的术语,因为我没有它现在制作了我自己。):
发布订阅:服务器将发布消息(例如更新价格信息),该消息被传递给订阅该类信息的所有客户端。您需要覆盖的一个重要案例是,在您的客户端在此类广播期间断开连接时,会发生什么情况。你必须确保它不会错过任何信息,或有办法再次赶上。
失火和遗忘:一个通信伙伴(例如客户端)会发送一条消息,而不会期待任何形式的响应。排队系统将负责最终交付。这可以用于提交订单等。
回电:这就像两个或更多的火灾和忘记消息在相反的方向。随后的呼叫将有一个ID,以便将该消息标记为对之前收到的特定消息的响应。提交订单时这很有用,但需要某种答案。当然,答案可能会在一天后到达,因此您需要一份未完成订单列表,这些列表可能应该对用户可见,或者列表支持个人。发送多个回复时,您必须处理不按顺序到达的邮件的情况。如果可能,处理这个问题的好方法是在每条消息中包含早期消息的所有信息。这样你可以简单地丢弃旧信息。
所以通信会像这样工作: - 服务器偶尔更新发送到所有客户端。消息可能应该包含某种版本信息,因此客户端可以确保它们具有所有消息。 - 定期(或aftger从服务器接收一段时间没有更新或...)客户端请求来自服务器的特殊更新,以确保它具有所有当前信息。上面提到的版本信息可用于识别缺失的信息 - 客户端收到消息并将内容存储在本地数据库中 - 客户端从数据库中读取信息以向用户提供信息 - 客户端提交订单或任何时间服务器,可能接收不同步的回答
一些普遍性的建议:
随着排队你在地狱并发的中间。所以,对所有可能出现“错误”的东西进行创意。例子是 - 邮件到达不按顺序 - 发送时接收器不可用(这也是首先使用邮件的原因) - 接收器不可用并且不会返回在线状态。消息传递服务器有保证传递的选项。这意味着他们必须存储消息直到实际发送消息。如果客户永远不会回到在线状态,则邮件将永远保留,填满存储空间
确保所有邮件处理与应用程序的其余部分完全分离,以便于测试。
思考升级服务器和客户端的过程,特别是当消息格式发生变化时。您或者必须在相同的时间点升级所有时间,或者您的服务器必须能够处理一段时间的新旧消息格式。
我不擅长这个来制定答案。您可能想看看“企业集成模式”(Hohpe,Woolf,Addison-Wesley)。然而,这个要求听起来很可怕:“即使网络连接或服务器出现故障,客户端也应该能够工作,但只需几天左右”,“服务器用于分发[...]为客户提供价格。“你能保证价格不会改变,即你知道价格预先变化的日期吗? “ – mnemosyn 2010-04-06 15:51:09
”我的想法是,应用程序从数据库中读取数据,但写入消息代理,消息代理写入数据库并与服务器通信。或者这是一个坏主意?...“ 这不是一个坏主意的想法,但你至少应该决定你期望使用哪个消息代理。有些人可能有预制件与数据库直接对话,否则你也应该在另一边编码... – 2010-04-06 16:04:17
@mnemosyn:不,价格变化时没有日期。价格可以改变,你也可以改变客户的价格。但是,直到连接重新启动后,才会将其分发给其他客户端。 – Jonas 2010-04-06 16:19:53