【问题标题】:Building a Queue Service - Serializing Tasks for later use构建队列服务 - 序列化任务以供以后使用
【发布时间】:2011-12-01 19:29:07
【问题描述】:

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

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

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

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

  • 创建任何类型的工作对象
  • 将其传递给 WCF 服务以将其存储在数据库中
  • 调用 WCF 服务以获取新工作项(找到的任何内容)
  • 将该工作项作为真实的(非强制转换)返回给客户端 对象

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

谢谢,

斯科特

【问题讨论】:

  • 一些想法 - 你能做一个 ITask 界面吗?或者,Task对象是否可以有一个实现ISerializable的成员变量“Details”?

标签: c# wcf serialization queue


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这实际上是使用像CouchDB 这样的 NOSQL 数据库的完美场景。如果您必须存储未绑定到硬模式但更多基于文档(或在您的情况下)任务的数据,则此类数据库是最佳选择。您可以通过类型来区分它们,但底层结构不受约束。

    CouchDB 是一种选择吗?然后检查 relax - CouchDB 的 .NET API。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多