我想开发一个工作流服务。
我所做的是以下内容:
问题: 我希望计算机一次只对一个图像进行图像处理(我正在使用共享托管,因此资源有限)
如何确保用户可以调用该服务,该服务将执行步骤1,2,3(因为这不是非常耗时),而是等到上一个图像处理完毕?
请给我任何建议。我是新人,只是在学习。 谢谢。
PS:我还想通过将DB与状态进行交互来让客户端看到它的图像状态。我可以将其纳入工作流程服务吗?我应该这样做还是应该是一个单独的服务?
答案 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)
使用消息队列实现图像处理。将文件上载到服务器然后将其保存到磁盘,将记录插入数据库并通过将消息插入队列来对文件进行排队以进行处理。然后一次一个地处理队列中的图像,并在数据库中完成更新文件状态。