Skip to content

Commit

Permalink
Refactor WorkflowInstanceObserverFactory and add error handling
Browse files Browse the repository at this point in the history
The constructor of WorkflowInstanceObserverFactory class has been refactored to improve code readability and maintainability. Extra error handling has also been added to manage scenarios where the connection to the Workflow Instance Observer Hub cannot be established. A warning log is now generated in such cases, providing feedback for troubleshooting issues related to the RealTimeWorkflows feature.
  • Loading branch information
sfmskywalker committed Apr 5, 2024
1 parent 96aaa36 commit 1d526cf
Showing 1 changed file with 21 additions and 19 deletions.
@@ -1,43 +1,45 @@
using System.Net;
using Elsa.Studio.Contracts;
using Elsa.Studio.Workflows.Contracts;
using Elsa.Studio.Workflows.Extensions;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Logging;

namespace Elsa.Studio.Workflows.Services;

/// <inheritdoc />
public class WorkflowInstanceObserverFactory : IWorkflowInstanceObserverFactory
public class WorkflowInstanceObserverFactory(
IRemoteBackendApiClientProvider remoteBackendApiClientProvider,
IRemoteFeatureProvider remoteFeatureProvider,
IHttpMessageHandlerFactory httpMessageHandlerFactory,
ILogger<WorkflowInstanceObserverFactory> logger) : IWorkflowInstanceObserverFactory
{
private readonly IRemoteBackendApiClientProvider _remoteBackendApiClientProvider;
private readonly IRemoteFeatureProvider _remoteFeatureProvider;
private readonly IHttpMessageHandlerFactory _httpMessageHandlerFactory;

/// <summary>
/// Initializes a new instance of the <see cref="WorkflowInstanceObserverFactory"/> class.
/// </summary>
public WorkflowInstanceObserverFactory(IRemoteBackendApiClientProvider remoteBackendApiClientProvider, IRemoteFeatureProvider remoteFeatureProvider, IHttpMessageHandlerFactory httpMessageHandlerFactory)
{
_remoteBackendApiClientProvider = remoteBackendApiClientProvider;
_remoteFeatureProvider = remoteFeatureProvider;
_httpMessageHandlerFactory = httpMessageHandlerFactory;
}

/// <inheritdoc />
public async Task<IWorkflowInstanceObserver> CreateAsync(string workflowInstanceId, CancellationToken cancellationToken = default)
{
// Only observe the workflow instance if the feature is enabled.
if (!await _remoteFeatureProvider.IsEnabledAsync("Elsa.RealTimeWorkflowUpdates", cancellationToken))
if (!await remoteFeatureProvider.IsEnabledAsync("Elsa.RealTimeWorkflowUpdates", cancellationToken))
return new DisconnectedWorkflowInstanceObserver();

// Get the SignalR connection.
var baseUrl = _remoteBackendApiClientProvider.Url;
var baseUrl = remoteBackendApiClientProvider.Url;
var hubUrl = new Uri(baseUrl, "hubs/workflow-instance").ToString();
var connection = new HubConnectionBuilder()
.WithUrl(hubUrl, _httpMessageHandlerFactory)
.WithUrl(hubUrl, httpMessageHandlerFactory)
.Build();

var observer = new WorkflowInstanceObserver(connection);
await connection.StartAsync(cancellationToken);

try
{
await connection.StartAsync(cancellationToken);
}
catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound)
{
logger.LogWarning("The workflow instance observer hub was not found, but the RealTimeWorkflows feature was enabled. Please make sure to call `app.UseWorkflowsSignalRHubs()` from the workflow server to install the required SignalR middleware component. Falling back to disconnected observer");
return new DisconnectedWorkflowInstanceObserver();
}

await connection.SendAsync("ObserveInstanceAsync", workflowInstanceId, cancellationToken: cancellationToken);

return observer;
Expand Down

0 comments on commit 1d526cf

Please sign in to comment.