Azure Service Bus - 必须在发送真实消息之前添加假消息 - 为什么?

时间:2018-04-24 11:14:53

标签: azure azure-servicebus-queues

我面临一个奇怪的问题,我没有可能的原因。场景是

  1. 从队列中获取传入消息
  2. 处理它,然后将新消息添加到另一个队列
  3. 但问题是,如果我完成传入消息的长时间运行任务,然后尝试将新消息添加到另一个队列,我就不会收到它。如果我只是将face消息添加到另一个队列,那么我可以在长时间运行操作完成后收到真实消息。但为什么 ?我不想将任何虚假消息放入队列,但如果没有,我的方案不起作用。有什么想法吗?

    public class WorkerRole : RoleEntryPoint
    {
        // QueueClient is thread-safe. Recommended that you cache 
        // rather than recreating it on every request
        Microsoft.ServiceBus.Messaging.QueueClient Client;
        ManualResetEvent CompletedEvent = new ManualResetEvent(false);
    
        public override void Run()
        {
            MyResult result = null;
    
            var queueClient = new Microsoft.Azure.ServiceBus.QueueClient("QueueConnectionString", "QueueName");
    
            Client.OnMessage(async (receivedMessage) =>
                {
                    try
                    {
                        using (Stream stream = receivedMessage.GetBody<Stream>())
                        {
                            using (StreamReader reader = new StreamReader(stream))
                            {
                                string json = reader.ReadToEnd();
    
                                OCRQueueItem_Incoming item = JsonConvert.DeserializeObject<IncomingClass>(json);
                                var someClass = new OCRManager();
    
                                var message = new Message(Encoding.UTF8.GetBytes("test 1"));
    
                                await queueClient.SendAsync(message);
    
                                result = new SomeManager().RunLongRunningTask(item); //it runs for 1-2min                         
                            }
                        }
                    }
                    catch (Exception ex) { }
                    finally
                    {
                        var json = JsonConvert.SerializeObject(result);
    
                        var message = new Message(Encoding.UTF8.GetBytes(json));
    
                        await queueClient.SendAsync(message);
                    }
                });
    
            CompletedEvent.WaitOne();
        }
    
        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;
    
            string connectionString = CloudConfigurationManager.GetSetting("Queue.ConnectionString");           
    
            Client = Microsoft.ServiceBus.Messaging.QueueClient.Create(connectionString);
            return base.OnStart();
        }
    
        public override void OnStop()
        {
            Client.Close();
            CompletedEvent.Set();
            base.OnStop();
        }
    }
    

0 个答案:

没有答案
相关问题