在生产中添加RabbitMQ.dll后,Quartz调度程序无法运行

时间:2017-04-25 07:39:53

标签: rabbitmq quartz-scheduler

在某个时间(一周)之前,我的应用程序运行正常。所有调度程序都运行良好。那时我们使用MSMQ进行队列定位。

现在,我们实现并将所有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);

提前致谢!!

1 个答案:

答案 0 :(得分:0)

这是线程的问题。

我们有一个no的参数。石英线。假设,它的值是10。

我们在石英开始工作时启动一个rabbitmq队列。

你在上面的代码中看到,在rabbitmq start方法中,有while循环。 所以它永远不会结束。

在第二次触发作业后,它会再创建一个消费者,但它永远不会结束。

经过一段时间线程接近线程限制。

一旦线程达到线程限制,就不会创建新线程。它停止了我们的调度程序。