2017-04-25 10 views
0

いつか(1週間前)、私のアプリケーションは完全に動作していました。すべてのスケジューラが完全に動作していました。その時点では、キューの目的にMSMQを使用します。生産時にRabbitMQ.dllを追加した後、クォーツスケジューラを実行できません

ここで、すべてのMSMQを実装し、RabbitMQに転送します。 RabbitMQ(優先度付き)は完璧に動作していますが、現在は石英スケジューラが停止していますか?

我々は石英バージョン1.0.2.3 RabbitMQのバージョン3.6.0

を使用する誰もがこの問題で私を助けることはできますか?

RabbitMQのコードスニペット:

var factory = GetConnectionFactory(); 
      using (var connection = factory.CreateConnection()) 
      { 
       using (var channel = connection.CreateModel()) 
       { 
        IDictionary<String, Object> args = new Dictionary<String, Object>(); 
        channel.BasicQos(0, 1, false); 
        args.Add("x-max-priority", 3); 
        channel.QueueDeclare(queueName, true, false, false, args); 
        var consumer = new QueueingBasicConsumer(channel); 
        channel.BasicConsume(queueName, false, "", args, consumer); 
        while (true) 
        { 
         var ea = consumer.Queue.Dequeue(); 

         string message = Encoding.UTF8.GetString(ea.Body); 
         ProcessMessageFromQueue(message); 
         Log.Info("Message Received from " + queueName + ": " + message + " , ChannelId : " + channel.NextPublishSeqNo + " ,ea:" + ea.DeliveryTag); 
         channel.BasicAck(ea.DeliveryTag, false); 
         //MessageQueueMessage messageQueueMessage = Utility.DeserializeObject<MessageQueueMessage>(message); 
         DeleteRedisVAriableByKey(message); 
        } 
       } 
      } 

スケジューラスニペット - 事前に

NameValueCollection properties = null; 
    ISchedulerFactory sf = null; 
    IScheduler sched = null; 
    JobDetail jobDetail = null; 
    Quartz.CronTrigger trigger = null; 

    properties = new NameValueCollection(); 
    properties["quartz.scheduler.instanceName"] = "RemoteServer"; 
    properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 
    properties["quartz.threadPool.threadCount"] = "5"; 
    properties["quartz.threadPool.threadPriority"] = "Normal"; 
    sf = new StdSchedulerFactory(properties); 
    sched = sf.GetScheduler(); 
    sched.Start();    
    jobDetail = new JobDetail("MyJOb", "default", typeof(MyClass)); 
    trigger = new CronTrigger("MyTrigger", "default", ConfigurationManager.AppSettings["CronExpression"]); 
    sched.ScheduleJob(jobDetail, trigger); 

感謝!!

答えて

0

スレッドの問題です。

いいえのパラメータがあります。石英のスレッドの。値は10だとします。

開始ジョブでは、quartzによって1つのrabbitmqキューを開始します。

上記のコードでは、rabbitmq startメソッドでwhileループがあります。 これは決して終了しません。

トリガージョブを2回実行するともう1つのコンシューマが作成され、終了しません。

しばらくしてスレッド限界に近づきます。

スレッドがスレッド制限に達すると、新しいスレッドは作成されません。スケジューラが停止しました。

関連する問題