WWF - 关于Windows工作流服务的初学者的简单设计决策

时间:2011-12-03 00:58:14

标签: workflow-foundation

我想开发一个工作流服务。

我所做的是以下内容:

  1. 我将服务的网址发送到图片
  2. 将新记录插入到数据库中,表示imageABC.jpg 状态:"未决"
  3. 服务下载图像并将其保存在文件系统上
  4. 当服务器可以开始处理图像时,它会更新 状态为"开始处理"
  5. 服务对图像进行一些图像处理(时间 消耗)
  6. 服务完成图像处理作业并更新状态 完成"完成"在数据库表中
  7. 服务使用网址向图片
  8. 发送回复

    问题: 我希望计算机一次只对一个图像进行图像处理(我正在使用共享托管,因此资源有限)

    如何确保用户可以调用该服务,该服务将执行步骤1,2,3(因为这不是非常耗时),而是等到上一个图像处理完毕?

    请给我任何建议。我是新人,只是在学习。 谢谢。

    PS:我还想通过将DB与状态进行交互来让客户端看到它的图像状态。我可以将其纳入工作流程服务吗?我应该这样做还是应该是一个单独的服务?

2 个答案:

答案 0 :(得分:0)

要么同步也要异步。你对我的描述就像混合物一样。

单个方法调用可以一次完成所有操作,从而迫使客户端等待所有操作完成,或者您可以提供客户端可以调用以确定状态的不同方法,例如。

public enum DownloadStatus{
    Pending,
    Processing,
    Done,
}

public class YourService: IYourServiceInterface
{
     public Guid SubmitDownload(string imageUrl)...

     public DownloadStatus GetStatus(Guid downloadId) ...

     public byte[] GetResult(Guid downloadId)...

}

因此,您的客户将向您的服务提交下载。然后,该服务将imageUrl保存在数据库中,状态为Pending。计划任务(基本上是另一个应用程序)将读取所有待处理任务并开始下载,将每个下载任务标记为Processing。当计划任务下载并处理了图像时,它会将结果保存到某个地方(最可能存在于文件中,或者如果你坚持的话,保存在数据库中),并将状态设置为Done ......当这一切都进行时,客户端将通过调用GetStatus方法轮询服务以获取当前状态。应将轮询间隔调整为作业下载和处理图像所需的预期时间。客户端从Done收到GetStatus状态后,就会知道它可以调用GetResult并检索图像。

答案 1 :(得分:0)

使用消息队列实现图像处理。将文件上载到服务器然后将其保存到磁盘,将记录插入数据库并通过将消息插入队列来对文件进行排队以进行处理。然后一次一个地处理队列中的图像,并在数据库中完成更新文件状态。