当 运行 在 Service Fabric 应用程序中时,WebJob SDK 不工作
WebJob SDK not working when running in a Service Fabric application
我想在无状态服务中使用 WebJob SDK 运行 作为 Service Fabric 应用程序。不幸的是,我无法正确获取它 运行。下面是重现问题的测试代码的一部分。永远不会调用“ProcessMethod“。触发函数“ProcessNotificationsInQueue”也从未执行(是的,队列中有项目)。尽管应用程序仍然 运行.
,但在 Service Fabric Explorer 中应用程序的“运行状况”设置为“错误”
DashboardConnectionString 和 StorageConnectionString 都有正确的值。
当它在控制台应用程序或 WorkerRole 中 运行 时,我没有发现非常相似的代码有任何问题。
我错过了什么吗?是否有人已在 Service Fabric 应用程序中成功使用 WebJob SDK?
public sealed class TestStatelessService : StatelessService
{
public TestStatelessService(StatelessServiceContext context)
: base(context)
{ }
/// <summary>
/// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
/// </summary>
/// <returns>A collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[0];
}
/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;
JobHostConfiguration config = new JobHostConfiguration();
config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
config.Queues.BatchSize = 10;
config.Queues.MaxDequeueCount = 8;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
var host = new JobHost(config);
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken);
host.RunAndBlock();
}
[NoAutomaticTrigger]
public async Task ProcessMethod(CancellationToken cancellationToken)
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(this, "Working-{0}", ++iterations);
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
[Timeout("00:03:00")]
public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] Notification notification)
{
//Do something
}
}
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken)
请注意 TestStatelessService
class 没有定义无参数构造函数,因此您可以将 ProcessMethod
函数标记为静态。
根据您的描述,我按照此 tutorial 在您的代码上创建了一个 Azure Service Fabric application.Based,我在我的 Service Fabric 应用程序中成功测试了 WebJob SDK。这是我的代码示例,请尝试找出是否适合您。
TestStatelessService.cs
/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;
JobHostConfiguration config = new JobHostConfiguration();
config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
config.Queues.BatchSize = 10;
config.Queues.MaxDequeueCount = 8;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
var host = new JobHost(config);
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"),cancellationToken);
host.RunAndBlock();
}
[NoAutomaticTrigger]
public static async Task ProcessMethod(CancellationToken cancellationToken)
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
//log
Trace.TraceInformation(">>[{0}]ProcessMethod Working-{1}",DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"),++iterations);
//sleep for 5s
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
}
[Timeout("00:03:00")]
public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] CloudQueueMessage notification)
{
Trace.TraceInformation(">ProcessNotificationsInQueue invoked with notification:{0}", notification.AsString);
}
结果
The “Health State” of the application is set to “Error” in the Service Fabric Explorer although the application is still running.
请尝试调试您这边的代码,找出详细的错误。
我想在无状态服务中使用 WebJob SDK 运行 作为 Service Fabric 应用程序。不幸的是,我无法正确获取它 运行。下面是重现问题的测试代码的一部分。永远不会调用“ProcessMethod“。触发函数“ProcessNotificationsInQueue”也从未执行(是的,队列中有项目)。尽管应用程序仍然 运行.
,但在 Service Fabric Explorer 中应用程序的“运行状况”设置为“错误”DashboardConnectionString 和 StorageConnectionString 都有正确的值。
当它在控制台应用程序或 WorkerRole 中 运行 时,我没有发现非常相似的代码有任何问题。
我错过了什么吗?是否有人已在 Service Fabric 应用程序中成功使用 WebJob SDK?
public sealed class TestStatelessService : StatelessService
{
public TestStatelessService(StatelessServiceContext context)
: base(context)
{ }
/// <summary>
/// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
/// </summary>
/// <returns>A collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[0];
}
/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;
JobHostConfiguration config = new JobHostConfiguration();
config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
config.Queues.BatchSize = 10;
config.Queues.MaxDequeueCount = 8;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
var host = new JobHost(config);
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken);
host.RunAndBlock();
}
[NoAutomaticTrigger]
public async Task ProcessMethod(CancellationToken cancellationToken)
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(this, "Working-{0}", ++iterations);
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
[Timeout("00:03:00")]
public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] Notification notification)
{
//Do something
}
}
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken)
请注意 TestStatelessService
class 没有定义无参数构造函数,因此您可以将 ProcessMethod
函数标记为静态。
根据您的描述,我按照此 tutorial 在您的代码上创建了一个 Azure Service Fabric application.Based,我在我的 Service Fabric 应用程序中成功测试了 WebJob SDK。这是我的代码示例,请尝试找出是否适合您。
TestStatelessService.cs
/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;
JobHostConfiguration config = new JobHostConfiguration();
config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
config.Queues.BatchSize = 10;
config.Queues.MaxDequeueCount = 8;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
var host = new JobHost(config);
host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"),cancellationToken);
host.RunAndBlock();
}
[NoAutomaticTrigger]
public static async Task ProcessMethod(CancellationToken cancellationToken)
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
//log
Trace.TraceInformation(">>[{0}]ProcessMethod Working-{1}",DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"),++iterations);
//sleep for 5s
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
}
[Timeout("00:03:00")]
public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] CloudQueueMessage notification)
{
Trace.TraceInformation(">ProcessNotificationsInQueue invoked with notification:{0}", notification.AsString);
}
结果
The “Health State” of the application is set to “Error” in the Service Fabric Explorer although the application is still running.
请尝试调试您这边的代码,找出详细的错误。