Write Configuration
Configure topic and queue publication behavior using WithWriteConfiguration. These settings control encryption, compression, message retention, and error handling for published messages.
Configuration Usage
Write configuration is accessed through the publication builders:
config.Publications(x =>
{
// For topics
x.WithTopic<OrderPlacedEvent>(cfg =>
{
cfg.WithWriteConfiguration(w =>
{
// Configure SNS write settings
});
});
// For queues
x.WithQueue<ProcessPaymentCommand>(cfg =>
{
cfg.WithWriteConfiguration(w =>
{
// Configure SQS write settings
});
});
});
Note that these configuration options are per topic or queue.
Topic Write Configuration (SNS)
Encryption
Encryption
Configures server-side encryption using AWS Key Management Service (KMS). Provide a ServerSideEncryption object with the KMS Key ID.
cfg.WithWriteConfiguration(w =>
{
w.Encryption = new ServerSideEncryption
{
KmsMasterKeyId = "arn:aws:kms:us-east-1:123456789012:key/your-key-id"
};
});
See Encryption for more details and required IAM permissions.
Compression
CompressionOptions
Compresses message bodies to reduce size and AWS costs. Specify a PublishCompressionOptions object with compression encoding and threshold.
cfg.WithWriteConfiguration(w =>
{
w.CompressionOptions = new PublishCompressionOptions
{
CompressionEncoding = ContentEncodings.GzipBase64,
MessageLengthThreshold = 100_000 // Compress messages > 100KB
};
});
See Compression for more details.
Error Handling
HandleException
Provides a custom exception handler for publish failures. Return true to mark the exception as handled, or false to rethrow it.
cfg.WithWriteConfiguration(w =>
{
w.HandleException = (exception, message) =>
{
// Log the error
Console.WriteLine($"Failed to publish message {message.Id}: {exception.Message}");
// Return false to rethrow
return false;
};
});
Subject
Subject
Sets a custom SNS message subject. By default, JustSaying uses the message type name.
cfg.WithWriteConfiguration(w =>
{
w.Subject = "Custom Subject for All Messages";
});
Raw Message Delivery
IsRawMessage
When true, publishes messages without the JustSaying envelope. Use this for interoperability with non-JustSaying systems.
cfg.WithWriteConfiguration(w =>
{
w.IsRawMessage = true;
});
Queue Write Configuration (SQS)
Queue write configuration includes all the topic configuration options plus additional SQS-specific settings.
Encryption
WithEncryption(string masterKeyId)
Configures server-side encryption for the SQS queue using a KMS key ID.
cfg.WithWriteConfiguration(w =>
{
w.WithEncryption("your-kms-key-id");
});
WithEncryption(ServerSideEncryption encryption)
Configures server-side encryption using a ServerSideEncryption object.
cfg.WithWriteConfiguration(w =>
{
w.WithEncryption(new ServerSideEncryption
{
KmsMasterKeyId = "arn:aws:kms:us-east-1:123456789012:key/your-key-id"
});
});
Error Queue
WithErrorQueue()
Specifies that an error queue should be created for this publication. This is the default behavior.
cfg.WithWriteConfiguration(w =>
{
w.WithErrorQueue();
});
WithNoErrorQueue()
Specifies that no error queue should be created for this publication.
cfg.WithWriteConfiguration(w =>
{
w.WithNoErrorQueue();
});
WithErrorQueueOptOut(bool value)
Explicitly opts in or out of error queue creation. WithErrorQueue and WithNoErrorQueue delegate to this method.
cfg.WithWriteConfiguration(w =>
{
w.WithErrorQueueOptOut(shouldOptOut: true); // No error queue
});
Message Retention
WithMessageRetention(TimeSpan value)
Specifies how long messages should be kept in the queue before being automatically deleted. The default is 4 days. AWS allows retention from 60 seconds to 14 days.
cfg.WithWriteConfiguration(w =>
{
w.WithMessageRetention(TimeSpan.FromDays(7));
});
Visibility Timeout
WithVisibilityTimeout(TimeSpan value)
Specifies how long a message should be invisible to other consumers after being retrieved. The default is 30 seconds. For messages that take a long time to process, increase this value to avoid duplicate handling.
cfg.WithWriteConfiguration(w =>
{
w.WithVisibilityTimeout(TimeSpan.FromMinutes(5));
});
Complete Examples
Topic with Encryption and Compression
config.Publications(x =>
{
x.WithTopic<LargeSecureEvent>(cfg =>
{
cfg.WithWriteConfiguration(w =>
{
// Encrypt at rest
w.Encryption = new ServerSideEncryption
{
KmsMasterKeyId = "your-kms-key-id"
};
// Compress large messages
w.CompressionOptions = new PublishCompressionOptions
{
CompressionEncoding = ContentEncodings.GzipBase64,
MessageLengthThreshold = 50_000
};
});
});
});
Queue with Custom Retention and No Error Queue
config.Publications(x =>
{
x.WithQueue<TemporaryCommand>(cfg =>
{
cfg.WithWriteConfiguration(w =>
{
// Keep messages for only 1 hour
w.WithMessageRetention(TimeSpan.FromHours(1));
// Don't create an error queue
w.WithNoErrorQueue();
// Long visibility timeout for slow processing
w.WithVisibilityTimeout(TimeSpan.FromMinutes(10));
});
});
});
Advanced Topics
For more information on specific configuration topics, see:
- Compression - Reducing message size and costs
- Encryption - Securing messages with AWS KMS
- Dynamic Topics - Multi-tenant message routing