2

使用WebJobs我是新来的Azure的服务总线,并正在致力于使用服务总线队列,WebJobs,在Azure SDK v2.5版本的和Visual Studio概念证明2013与Azure的服务总线和会话

排队和排队来自总线的消息非常简单,但为了实现请求 - 响应模式,它看起来像我需要使用会话,这就是车轮脱落的地方。

这是来自WebJobs项目的概念证明代码。它要求您创建两个服务总线队列:测试请求测试响应。响应队列必须具有启用会话=真

class Program 
{ 
    private static string _azureServiceBusConnection; 

    static void Main() 
    { 
     _azureServiceBusConnection = ConfigurationManager.ConnectionStrings["AzureWebJobsServiceBus"].ConnectionString; 

     var host = new JobHost(); 
     Task.Factory.StartNew(() => Run()); 

     try 
     { 
      host.RunAndBlock(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("RunAndBlock() Unexpected {0}: {1}", ex.GetType().FullName, ex.Message); 
      throw; 
     } 
    } 

    private static async Task Run() 
    { 
     await Task.Delay(1000); 

     var request = QueueClient.CreateFromConnectionString(_azureServiceBusConnection, "test-request"); 
     var response = QueueClient.CreateFromConnectionString(_azureServiceBusConnection, "test-response"); 

     var sessionid = Guid.NewGuid().ToString(); 
     MessageSession receiver; 
     try 
     { 
      receiver = response.AcceptMessageSession(sessionid); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("AcceptMessageSession() Unexpected {0}: {1}", ex.GetType().FullName, ex.Message); 
      throw; 
     } 

     var payload = new RequestModel {ID = Guid.NewGuid(), Delay = 1}; 
     var message = new BrokeredMessage(payload) {ReplyToSessionId = sessionid}; 
     try 
     { 
      request.Send(message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Send() Unexpected {0}: {1}", ex.GetType().FullName, ex.Message); 
      throw; 
     } 

     var receivedMessage = receiver.Receive(TimeSpan.FromSeconds(5)); 
     if (receivedMessage != null) 
     { 
      // Request processed within the timeout period 
      var responseBody = receivedMessage.GetBody<RequestModel>(); 
      Console.WriteLine("Inline response to {0}", responseBody.ID); 
      receivedMessage.Complete(); 
     } 
     else 
     { 
      // Request processing timed out - should be handled by LocalResponseQueue WebJob (see below) 
      Console.WriteLine("ERROR: Response timed out."); 
     } 
    } 
} 

public class RequestModel 
{ 
    public Guid ID { get; set; } 
    public int Delay { get; set; } 
} 

public class RemoteSystemRequestQueue 
{ 
    // Simulates the processing of the request on a remote system 
    public static void ProcessQueueMessage([ServiceBusTrigger("test-request")] BrokeredMessage request, [ServiceBus("test-response")] out BrokeredMessage response) 
    { 
     // Wait for the prescribed delay, then bounce the request payload back via the response queue 
     var requestBody = request.GetBody<RequestModel>(); 
     Console.WriteLine("Recieved Request {0}, delay={1}", requestBody.ID, requestBody.Delay); 
     Task.Delay(requestBody.Delay * 1000).Wait(); 
     response = new BrokeredMessage(requestBody) {SessionId = request.ReplyToSessionId}; 
     request.Complete(); 
     Console.WriteLine("Completed Request {0}, delay={1}", requestBody.ID, requestBody.Delay); 
    } 
} 

public class LocalResponseQueue 
{ 
    // Should be called ONLY when the processing took longer than the timeout 
    public static void ProcessQueueMessage([ServiceBusTrigger("test-response")] BrokeredMessage message, TextWriter logger) 
    { 
     var msgBody = message.GetBody<RequestModel>(); 
     Console.WriteLine("ResponseFactory Recieved Reply {0}", msgBody.ID); 
    } 
} 

启用会话上的测试响应队列=真,调用host.RunAndBlock()抛出一个System.InvalidOperationException与消息

这是不可能的,需要的会话的实体建立一个非sessionful消息接收机

的outpu牛逼看起来是这样的:

Found the following functions: 
ServiceBusPoc.RemoteSystemRequestQueue.ProcessQueueMessage 
ServiceBusPoc.LocalResponseQueue.ProcessQueueMessage 
Executing: 'RemoteSystemRequestQueue.ProcessQueueMessage' because New service bus message detected on 'test-request'. 
Recieved Request 4f000f8f-dd69-4909-9ec4-020fec12366c, delay=1 
RunAndBlock() Unexpected System.InvalidOperationException: It is not possible for an entity that requires sessions to create a non-sessionful message receiver. 
TrackingId:7836ac90-6920-4e6c-b7f1-cf648e2a17e5_G38_B10,TimeStamp:10/6/2015 12:37:05 PM 

注意异常被抛出的RemoteSystemRequestQueue对象之前能完成处理排队的请求

我从这个假设,这意味着WebJobs不能处理的会话(至少在我正在使用它们的方式)

任何人都可以对此有所了解,还是我将不得不放弃WebJobs?

回答

0

您使用的是什么版本的WebJobs SDK?在我们目前的v1.1.0版本中(仍然是预发行),我们已经开始为ServiceBus配置打开更多选项。请参阅:

可以基本上现在控制更多的先前埋在SDK内部消息的详细信息。但是,关于完整的会话支持,我们确实有this open issue,可能更接近您的方案。如果是这样,并且如果您无法使用上述内容,请将您的场景详细信息添加到该问题中。谢谢。