Skip to content

Upgrade to v21.0.0

In general, all major components in the Shuttle space have a semver version number starting at 21.0.0.

Breaking Changes

Please note that there are quite a few breaking changes.

Shuttle.Core

Note: All Shuttle.Core.* packages have been renamed to Shuttle.* (dropped the Core).

Shuttle.Contract

  • Throwing ArgumentNullException instead of NullReferenceException for AgainstNull and AgainstNullOrEmptyString.

Shuttle.Data

Note: This package has been deprecated.

Shuttle.Mediator

  • All participants now registered as Scoped by default.

Shuttle.Pipelines

  • The CancellationToken has been removed from IPipelineContext and been added to IPipelineObserver<T>.ExecuteAsync(IPipelineContext<T> pipelineContext, CancellationToken cancellation = default).

Shuttle.Esb -> Shuttle.Hopper

Note: Shuttle.Esb has been deprecated and Shuttle.Hopper now contains service bus functionality.

BREAKING: The TransportMessage has breaking changes but any messages sent from Shuttle.Esb may still be processed by a Shuttle.Hopper endpoint. However, messages sent from a Shuttle.Hopper endpoint will fail if processed by a Shuttle.Esb endpoint. Please upgrade all related endpoints together.

Packages

The following packages have been renamed to align with Shuttle.Hopper and using SqlServer instead of Sql:

  • Shuttle.Esb -> Shuttle.Hopper
  • Shuttle.Esb.AmazonSqs -> Shuttle.Hopper.AmazonSqs
  • Shuttle.Esb.AzureEventHubs -> Shuttle.Hopper.AzureEventHubs
  • Shuttle.Esb.AzureStorageQueues -> Shuttle.Hopper.AzureStorageQueues
  • Shuttle.Esb.Kafka -> Shuttle.Hopper.Kafka
  • Shuttle.Esb.RabbitMQ -> Shuttle.Hopper.RabbitMQ
  • Shuttle.Esb.Sql.Queue -> Shuttle.Hopper.SqlServer.Queue
  • Shuttle.Esb.Sql.Subscription -> Shuttle.Hopper.SqlServer.Subscription

Any other Shuttle.Esb.* packages present in v20 are not currently available in this release.

Package Registration Convention

Previously, service bus functionality and transports were configured directly on the IServiceCollection instance:

c#
services.AddServiceBus(builder => { /* ... */ });
services.AddAmazonSqs(builder => { /* ... */ });
services.AddRabbitMQ(builder => { /* ... */ });

In Shuttle.Hopper, configuration has been consolidated into a fluent builder API. You first call AddHopper on the IServiceCollection, and then chain transport and feature configurations using the .Use[Component]() pattern:

c#
services.AddHopper(options => 
    {
        // Configure HopperOptions here
    })
    .UseAmazonSqs(builder => { /* ... */ })
    .UseRabbitMQ(builder => { /* ... */ });

Transport Configuration Options

Across all transports, the approach to customizing the underlying provider has changed. Previously, many options classes exposed event EventHandler properties (e.g., Configure, ConfigureConsumer, ConfigureBlobStorage) to hook into or override provider-specific settings.

These events have been removed and replaced with direct properties on the respective options classes to supply the configuration or builders natively.

  • AmazonSqs: Removed the Configure event and the ServiceUrl property. Added AWSCredentials AwsCredentials and AmazonSQSConfig AmazonSqsConfig properties.
  • AzureStorageQueues: Removed the Configure event. Added a QueueClientOptions QueueClient property.
  • AzureEventHubs: Removed ConfigureBlobStorage, ConfigureProcessor, and ConfigureProducer events. Replaced by BlobClientOptions BlobClient, EventProcessorClientOptions ProcessorClient, and EventHubProducerClientOptions ProducerClient properties. The ProcessError event is now an AsyncEvent<EventHubProcessErrorEventArgs> property.
  • Kafka: Removed BuildConsumer, BuildProducer, ConfigureConsumer, and ConfigureProducer events. Replaced by direct ConsumerBuilder, ProducerBuilder, ConsumerConfig, and ProducerConfig properties.
  • RabbitMQ: Removed the Configure event. Added a ConnectionFactory ConnectionFactory property.

Inbox options

  • WorkQueueUri renamed to WorkTransportUri.
  • DeferredQueueUri renamed to DeferredTransportUri.
  • ErrorQueueUri renamed to ErrorTransportUri.
  • DurationToIgnoreOnFailure renamed to IgnoreOnFailureDurations.

TransportMessage

  • DateTime ExpiryDate changed to DateTimeOffset ExpiresAt.
  • DateTime IgnoreTillDate changed to DateTimeOffset IgnoreUntil.
  • DateTime SendDate changed to DateTimeOffset SentAt.

TransportMessageBuilder

  • Local() renamed to ToSelf().
  • Defer() renamed to DeferUntil(DateTimeOffset) and DeferFor(TimeSpan).
  • WillExpire() renamed to ExpiresAt(DateTimeOffset) and ExpiresIn(TimeSpan).

Shuttle.Esb.Sql.Subscription (now Shuttle.Hopper.SqlServer.Subscription)

Previously the SQL subscription service was registered like this:

c#
services
    .AddSqlSubscription()
    .AddServiceBus(builder =>
    {
        builder.Options.Subscription.ConnectionStringName = "ProcessManagement";
    });

It now needs to be registered via the AddHopper builder like this:

c#
services
    .AddHopper(options => 
    {
        // configure hopper options
    })
    .UseSqlServerSubscription(options =>
    {
        options.ConnectionString = "Data Source=...";
        options.Schema = "dbo"; // Optional.  Defaults to `dbo`
    });

Shuttle.Recall

Packages

The following packages have been renamed to use SqlServer instead of Sql:

  • Shuttle.Recall.Sql.EventProcessing -> Shuttle.Recall.SqlServer.EventProcessing
  • Shuttle.Recall.Sql.Storage -> Shuttle.Recall.SqlServer.Storage

Changes

  • Renamed IAsyncEventHandler to IEventHandler.
  • Removed EventStore.CreateEventStream. Using EventStore.GetAsync will return an empty event stream if none exists.
  • Renamed EventStream.AddEvent to EventStream.Add.
  • Removed snapshots as such funcationality should be modelled explicity, for instance using the Closing the Books pattern.