2017-01-31 10 views
1

Я пытаюсь использовать сообщения EventHub из WebJob безрезультатно. Работа строится и запускается без каких-либо исключений, но триггер никогда не вызывается. Я ссылаюсь на Microsoft.Azure.WebJobs, Microsoft.Azure.WebJobs.Extensions и Microsoft.Azure.WebJobs.ServiceBus v2.0.0.0-beta2.Использование Azure WebJob для чтения из EventHub

Вот мой код:

Program.cs:

public static void Main() 
{ 
    var eventHubConfig = new EventHubConfiguration(); 
    string eventHubName = "myHub"; 

    eventHubConfig.AddReceiver(eventHubName, "Endpoint=sb://xxxx.servicebus.windows.net/;SharedAccessKeyName=xxxx;SharedAccessKey=yyyy"); 
    config.UseEventHub(eventHubConfig); 

    JobHost host = new JobHost(config); 

    if (config.IsDevelopment) 
    { 
    config.UseDevelopmentSettings(); 
    } 

    host.RunAndBlock(); 
} 

Functions.cs:

public static void Trigger([EventHubTrigger("myHub")] string message) 
{ 
    _logger.Debug("Message received"); 
} 

В моем app.config, я установил соответствующий строки подключения для AzureWebJobsDashboard, AzureWebJobsServiceBus и AzureWebJobsStorage.

Я пробовал все: от использования пакетов сообщений до изменения сигнатуры метода триггера, в частности, для типа параметра EventData или byte []. Ничего не работает. Я должен отметить, что сообщения отправляются в EventHub в виде массивов байтов, завернутых в EventData.

Что мне не хватает?

Благодарим вас за внимание и ожидаем ответов.

+0

из любопытства, есть вы смотрели на Azure Functions и Web Job? –

+0

Вы видите ошибки в файле журнала WebJob? – mathewc

+0

Любые обновления? Вы решили эту проблему? –

ответ

2

Согласно вашему описанию, я следовал Azure WebJobs SDK EventHub support и Get started with Event Hubs, чтобы проверить этот вопрос на моей стороне. И я мог бы получать сообщения, вы можете сослаться на мой фрагмент кода:

Program.cs

class Program 
{ 
    static string eventHubName = "{your-EventHub-name}"; 
    static string connectionString = "{RootManageSharedAccessKey-connection-string}"; 
    static void Main(string[] args) 
    { 
     JobHostConfiguration config = new JobHostConfiguration(); 
     config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Error; 

     var eventHubConfig = new EventHubConfiguration(); 
     eventHubConfig.AddReceiver(eventHubName, connectionString); 
     config.UseEventHub(eventHubConfig); 

     JobHost host = new JobHost(config); 
     if (config.IsDevelopment) 
     { 
      config.UseDevelopmentSettings(); 
     } 

     //Send test messages 
     Task.Run(() => { 
      SendingRandomMessages(); 
     }); 

     host.RunAndBlock(); 
    } 

    static void SendingRandomMessages() 
    { 
     var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString,eventHubName); 
     while (true) 
     { 
      try 
      { 
       var message = Guid.NewGuid().ToString(); 
       Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, message); 
       eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes(message))); 
      } 
      catch (Exception exception) 
      { 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("{0} > Exception: {1}", DateTime.Now, exception.Message); 
       Console.ResetColor(); 
      } 

      Thread.Sleep(4000); 
     } 
    } 
} 

Functions.cs

public static void Trigger([EventHubTrigger("{your-EventHub-name}")] EventData message) 
{ 
    string data = Encoding.UTF8.GetString(message.GetBytes()); 
    Console.ForegroundColor = ConsoleColor.Green; 
    Console.WriteLine($"Message received. Data: '{data}'"); 
    Console.ResetColor(); 
} 

Packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net451" /> 
    <package id="Microsoft.Azure.ServiceBus.EventProcessorHost" version="2.2.6" targetFramework="net451" /> 
    <package id="Microsoft.Azure.WebJobs" version="2.0.0-beta2" targetFramework="net451" /> 
    <package id="Microsoft.Azure.WebJobs.Core" version="2.0.0-beta2" targetFramework="net451" /> 
    <package id="Microsoft.Azure.WebJobs.ServiceBus" version="2.0.0-beta2" targetFramework="net451" /> 
    <package id="Microsoft.Data.Edm" version="5.6.4" targetFramework="net451" /> 
    <package id="Microsoft.Data.OData" version="5.6.4" targetFramework="net451" /> 
    <package id="Microsoft.Data.Services.Client" version="5.6.4" targetFramework="net451" /> 
    <package id="Microsoft.WindowsAzure.ConfigurationManager" version="1.8.0.0" targetFramework="net451" /> 
    <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net451" /> 
    <package id="System.Spatial" version="5.6.4" targetFramework="net451" /> 
    <package id="WindowsAzure.ServiceBus" version="3.4.1" targetFramework="net451" /> 
    <package id="WindowsAzure.Storage" version="7.2.1" targetFramework="net451" /> 
</packages> 

Результат:

Кроме того, вы можете войти в Azure Portal, проверить обзор лезвие вашего концентратора событий следующим образом:

+0

Отлично! ... Отлично работает для меня. У нас есть Partitioned приемник, добавляющий к вышеописанному процессу? что делать, если мне нужно прочитать из определенного раздела в хабе события (Say, EventHubReceiverTrigger ["EventHubName"]) что-то вроде этого? –

+0

Может ли быть сделано событие, чтобы вызвать функцию в webjob, таком как служебная шина? Вместо опроса eventhub на каждые 4 секунды ..? Возможно, я ошибаюсь. –

+0

В методе SendingRandomMessages, после того как я отправил сообщение, он будет спать в течение 4 секунд до отправки другого нового сообщения. –