构建队列服务——序列化任务以供以后使用



我正在创建一个"队列管理器"服务,它的唯一职责是将工作项添加到队列并从队列中删除工作项。我将服务实现为单例,因为我必须处理一些独特的同步问题。每当需要新任务时,我都会创建一个新的task对象,设置参数,然后将其发送给QueueManager服务,并将其添加到SQL数据库中。此时Task对象被序列化到数据库中。当一个流程从QueueManager请求一个项目时,服务会找到下一个可用的工作项目,并将其反序列化回Task对象——从那里返回给客户端。

从技术上讲,这工作得很好。但是,我不喜欢把所有类型的任务都塞到Task对象中。工作项的范围可以从复制文件到更新数据库。我必须向Task对象添加许多属性,这些属性对许多其他任务类型来说没有任何意义——这变得相当草率。我对如何解决这个问题的第一个想法是将Task实现为基类,然后让所有其他任务派生自Task。这将允许我拥有诸如CopyFileTask、UpdateDatabaseTask、DoLaundryTask等工作项。然后,我将对象序列化到数据库中,并添加一列来告诉我类型是什么,以便我知道以后如何反序列化它。

我看到这样做的第一个问题是WCF服务只需要返回一种类型。这将要求服务将工作项(例如CopyFileTask)向下强制转换为Task。然而,我现在需要将其转换回其实际类型,但客户端将不知道该类型是什么。

我可能没有很好地解释这个。简而言之,我需要:

  • 创建任意类型的工作对象
  • 将其传递给WCF服务以将其存储在DB中
  • 调用WCF服务来获取一个新的工作项(它找到的任何东西)
  • 将该工作项作为真实的(非强制转换的)返回给客户端。

My Queue需要非常通用,因为许多其他应用程序正在添加和删除工作项。这是为大规模并行系统设计的,将成为所有分布式工作项的中心。任何和所有的帮助和想法将非常感谢。

谢谢,斯科特

你看过ServiceKnownTypeAttribute吗?看看这个MSDN上的示例代码:http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx

这实际上是使用像CouchDB这样的NOSQL数据库的完美场景。如果您必须存储的数据没有绑定到硬模式,而是更多地基于文档(或在您的情况下)任务,那么这样的数据库是完美的。您可以通过类型来区分它们,但没有绑定底层结构。

CouchDB是一个选项吗?然后checkout relax——CouchDB的。net API。

如果没有,只存储基本数据,如type, created,…(设置查询以获取队列中的下一个任务所需的基本数据)放在SQL任务表的单独列中。然后你有一个列称为细节或工作项,它保存任务的详细信息为XML。

最新更新