在Host进程内调用WCF服务

时间:2012-08-30 14:51:47

标签: .net wcf web-services

我有一个关于调用消费WCF服务的架构问题。

目前,我的WCF服务包含2个函数SubmitJob和ProcessQueueJobs

  1. SubmitJob将作业放入单个队列,这可以通过许多客户端调用
  2. ProcessQueueJobs将处理队列中的所有作业,我不希望在此方法上有服务合同,我不希望SubmitJob调用ProcessQueueJobs
  3. 因此,我调用ProcessQueueJobs的最简单方法是获得服务合同,并通过简单的控制台应用程序进行扭曲,并计划每隔几分钟运行一次。我不太喜欢这个解决方案,因为我不想将ProcessQueueJob暴露给客户端。 那么在托管WCF服务的进程中运行ProcessQueueJobs的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我有一个WCF接口使用的控制器类(我有SOAP和REST接口)。

因此,当有人打电话给SubmitJob时,我会将其传递给控制器​​。

在控制器功能中,它会将其保存到队列中。

现在,在我的项目中,我有一个在这个类中定义的队列:

public static class WebServiceControllerStatic
{
   static ConcurrentQueue<WebServiceModels.Job> jobqueue = new ConcurrentQueue<WebServiceModels.Job>();

然后我有这两个方法,一个是将信息放入队列,另一个是启动线程来处理队列。

    public static WebServiceModels.Job[] JobQueue
    {
        set
        {
            value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
        }
    }
    public static void ProcessUpdateJobQueue()
    {
        Action UpdateJob = () =>
        {
            if (jobqueue.IsEmpty)
                return;
            int cnt = 0;
            Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
                (j) =>
                {
                    cnt++;
                });
        };
        if (processUpdateJobThread == null)
        {
            processUpdateJobThread = new System.Threading.Thread(() =>
            {
                while (true)
                {
                    UpdateJob();
                    UpdateJob();
                    System.Threading.Thread.Sleep(10000);
                }
            });
            processUpdateJobThread.Start();
        }
    }

在我的控制器方法中,我称之为,在您的情况下,只要进行一次SubmitJob调用:

WebServiceControllerStatic.JobQueue = jobs;
WebServiceControllerStatic.ProcessUpdateJobQueue();

因此,我有一个队列可以保存需要处理的内容,以及一个经常启动的线程来处理队列中的任何内容。

这适合我的需要。

我使用ConcurrentQueue主要是因为我会同时更新并从队列中删除。