2011-09-12 25 views
2

我正在开发一个系统,接收与医院患者活动相关的消息,解析并存储此数据(HL7 2.x消息)。 某些消息可能包含基本的患者信息,其他消息可能包含实验室结果,转录文档等。如何可靠地使用可靠的异步消息解析和存储数据?

我想使用异步可靠消息传递系统来执行此操作(例如WCF + MSMQ或Apache Camel + ActiveMQ看起来好像这些技术很适合

我很难理解如何应用这些技术来解决这个问题,虽然。 如果一个消息进来,出现什么问题时,解析和存储数据患者,我需要停止处理此患者的传入消息,直至问题得到解决。

如果发生问题,我并不想停止处理所有患者的信息,只是针对有问题的单个患者的信息。

是否有设计模式或处理这种我缺少的情况的一些方法?

我很可能会使用数据库来存储消息并跟踪个别患者队列。如果发生错误,我可以锁定患者,以便在问题解决之前不再处理消息。

我只是在寻找理智检查。有没有更简单的方法来做到这一点,还是手动管理数据库中的队列和患者是否可以合理地解决这个问题?

回答

4

这是非常相似,从客户端的最近的要求,这里是我们如何解决这个骆驼/ ActiveMQ的......使用ActiveMQ的message groups到单线程处理(维持秩序,等)为

  • 给定的患者,并仍然允许多线程处理
  • 设置骆驼exception handling给患者添加到例外列表(存储在HazelcastCache)时发生加工误差
  • 使用的骆驼filter路由消息异常利ST患者异常队列
  • 设置一个定时器周期性地从异常队列重试消息
  • 设置电子邮件通知异常发生时(使用aggregator如果这是高体积组消息到较少的电子邮件等)
  • 使用ActiveMQ JMX手动查看/重试/移动/删除邮件适当类选他们(建立一个基于Web的控制台来支持这一点)
1

你可以安全地使用基于内容的路由 http://camel.apache.org/content-based-router.html

然后为“麻烦的病人”将消息路由到一个特殊的队列。对于没有问题的患者,您可以照常处理。

然后,当患者“固定”时,可以使用JMS选择器从“麻烦队列”中将该患者的消息提取出来并放回常规队列,以便重新处理它们。

0

如何处理特定患者ID的故障。

那么每个病人有一个消息队列根本没有扩展。您可能有1000名患者,因此您需要保持相同数量的队列。恶梦。

因此,要处理同一队列上的多个患者记录,您需要使服务从您读取容错队列。

我的意思是,如果服务无法处理去排队信息(可能是由于该消息的数据问题,或下游依赖不可用),那么该服务可以做以下的一种或多种:

  1. 重试配置的次数(使用配置的频率)
  2. 将该消息与任何错误/诊断信息一起路由到另一个消息队列或另一个进程。
  3. 不做任何事情,并允许消息的生存时间超时,以便排队系统将其作为错误消息处理(不推荐)。

如果您有一个要求,即单个病人的消息总是按顺序处理,那么您有不同的挑战,并且需要在允许处理消息之前对每条消息执行去/不去查找。这是一个标准的有序交付实施。

希望这会有所帮助。

我想也许你应该重新发布一个新的问题或多个问题,你面临一个更有针对性的挑战。我觉得你目前面临着多重挑战。

0

http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/I会建议您与重新交付选项的ActiveMQ和骆驼使用。所以如果出现问题,您的邮件将被重新传递,直到邮件将被处理。此外,您可以指定可以重新投递的次数。请看看骆驼redilvery政策:

http://camel.apache.org/redeliverypolicy.html

而且,我已经写了其中使用骆驼和HL7一个简单的测试例子,也许可以帮助你:

http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/