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

时间:2011-12-01 19:29:08

标签: c# wcf serialization queue

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

从技术上讲,这很有效。但是,我不满意将所有类型的任务变为Task对象。工作项可以是从复制文件到更新数据库的任何内容。我必须向Task对象添加许多属性,这些属性对许多其他任务类型没有任何意义 - 它变得非常草率。我对如何解决这个问题的第一个想法是将Task作为基类实现,然后让所有其他任务从Task派生。这将允许我有CopyFileTask,UpdateDatabaseTask,DoLaundryTask等工作项。然后我会将对象序列化到数据库并添加一列来告诉我类型是什么,所以我知道如何反序列化它。

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

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

  • 创建任何类型的工作对象
  • 将其传递给WCF服务以将其存储在数据库
  • 调用WCF服务以获取新工作项(找到的任何内容)
  • 将该工作项目作为真实(非铸造)重新调整为客户端 对象

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

谢谢,

斯科特

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这实际上是使用像CouchDB这样的NOSQL数据库的完美方案。如果您必须存储未绑定到硬架构但是更多文档(或在您的情况下)基于任务的数据,则此类数据库是peferct。你按类型对它们进行了命运,但是底层结构没有约束。

CouchDB是一个选择吗?然后签出relax - 一个用于CouchDB的.NET API。

如果没有,只需在SQL任务表的单独列中存储基本数据,如类型,创建,...(设置查询以获取队列中的下一个任务所需的基本数据)。然后你有一个名为details或workitem的列,它将你的任务的详细信息保存为XML。