我正在为我们的业务创建一个流程,它从数据库中获取一些数据(A),对数据进行一些处理,然后将其复制到另一个数据库中的另一个表中(B)。我们正在处理的数据量很大,我们预计此过程需要很长时间(数周)。
使用WCF这种任务是否是明智的设计选择?这样我认为我可以使用某种客户端应用程序/ Web前端(业务的其余部分可以使用)来“查询”/显示整个导入过程的进度。我还想让客户能够通过服务启动/暂停/停止导入过程。
这可以在WCF中执行吗?这是否是正确的选择?我想在某些方面,这需要像常规Windows服务一样(我只是认为通过WCF通过某些方法“查询”导入的进度会更容易吗?)
另外,如果一个用户试图同时启动/停止导入过程等,我是否会遇到问题?单例模式是否适用于确保每个人都使用相同的单一导入过程?
非常感谢任何想法/想法。
答案 0 :(得分:2)
编辑/前言:此答案假设您只想将WCF 用于与进程的用户交互,而不是用于整个软件堆栈的通信,并且核心工作已完成通过长期服务本身。
是的,这在WCF中是可行的,它可能是正确的解决方案。你将有一个长期运行的处理器线程,经常查询/更新一些互操作属性(例如,它将更新它完成的百分比,它正在处理的项目,并检查“暂停”标志等)。反过来,这些属性将由WCF接口方法查询/设置。
单例模式非常适用于此 - 如果正确设置了线程,则用户将与长期运行的线程(或多个线程)检查的某些属性进行交互。
从极高的角度来看,处理器类可能在核心看起来像这样(这只是一个如何完成它的模型;不要让它完全像这样或者我会做噩梦):
// IWcfProcessor is the ServiceContract interface
// Processor runs as a singleton and does (or has a thread that does) the processing work
class Processor : IWcfProcessor
{
public Processor()
{
new Thread(Process).Start();
}
public void Process()
{
while (Run)
{
// Do long-running process stuff, update some tables
PercentDone += 0.1;
}
}
public decimal PercentDone { get; set; }
public bool Run { get; set; }
/// WCF method defined in IWcfProcessor
public void SetState(bool state)
{
Run = state;
}
/// WCF method defined in IWcfProcessor
public decimal GetStatus()
{
return PercentDone;
}
}
然后,您可以从Web或应用程序端点挂接IWcfProcessor
个接触点。
另外,如果一个用户试图同时启动/停止导入过程等,我是否会遇到问题?
假设您正确设置了线程互操作,则不会出现问题。
单身模式是否适用于确保每个人都在使用相同的单一导入流程?
是的,这很完美。
答案 1 :(得分:2)
是。这可以与WCF Streaming一起使用。在这里,请查看我的answer以了解其他类似问题。