我正在开发一个系统,该系统接收与医院中患者活动相关的消息,解析并存储该数据(HL7 2.x消息)。 有些消息可能包含基本的患者信息,其他消息可能包含实验室结果,转录文档等。
我想使用异步可靠的消息系统来完成这项工作(例如WCF + MSMQ或Apache Camel + ActiveMQ。看起来这些技术似乎很合适。
我无法理解如何应用这些技术来解决问题。 如果在为患者解析和存储数据时出现消息并出现问题,我需要暂停处理该患者的传入消息,直到问题得到解决。
如果出现问题,我真的不想停止为所有患者处理消息,只是针对有问题的单个患者的消息。
是否有设计模式或某种处理此类情况的方法我不知道?
我很可能会使用数据库来存储消息并跟踪个别患者队列。如果发生错误,我可以锁定患者,以便在问题解决之前不再处理消息。
我只是在寻找理智检查。有没有更简单的方法,或者手动管理数据库中的队列和患者是解决这个问题的合理方法?
答案 0 :(得分:4)
这与客户最近的要求非常相似,以下是我们在Camel / ActiveMQ中解决这个问题的方法......
答案 1 :(得分:1)
您可以使用基于内容的路由器 http://camel.apache.org/content-based-router.html
然后将“麻烦病人”的消息路由到特殊队列。对于没有问题的患者,您可以照常处理。
然后,当患者“固定”时,您可以使用JMS选择器从“故障队列”中取出该患者的消息并将其放回常规队列,以便对其进行重新处理。
答案 2 :(得分:0)
如何处理特定患者ID的失败。
每位患者都有一个消息队列,根本无法扩展。您可能有1000名患者,因此您需要保持相同数量的队列。恶梦。
因此,要在同一队列中处理多个患者记录,您需要使从您队列中读取的服务具有容错能力。
我的意思是,如果服务无法处理出队消息(可能是由于消息的数据问题或下游依赖项不可用),那么该服务可以执行以下一项或多项操作:
如果您要求始终按顺序处理单个患者的消息,那么您将面临不同的挑战,并且需要在允许对每个消息进行处理之前对其执行go / no-go查找。这是标准的有序交付实施。
希望这会有所帮助。
我想也许你应该重新发布一个新问题或多个问题,以便面对更具针对性的挑战。我觉得你现在面临着多重挑战。
答案 3 :(得分:0)
http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/I会建议您使用带有重新传递选项的activemq和camel。因此,如果出现问题,您的消息将被重新发送,直到消息将被处理。此外,您可以指定可以重新发送的次数。请看一下骆驼redilvery政策:
http://camel.apache.org/redeliverypolicy.html
另外,我编写了一个简单的测试示例,使用camel和hl7,这可能会对你有所帮助:
http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/