Skip to content

Instantly share code, notes, and snippets.

View ramonsmits's full-sized avatar

Ramon Smits ramonsmits

View GitHub Profile
@ramonsmits
ramonsmits / MsmqExtensions.cs
Last active April 10, 2018 13:13
Get MSMQ queue length using Win32 interop
using System;
using System.Messaging;
using System.Runtime.InteropServices;
static class MsmqExtensions
{
/// <remarks>
/// Source: http://functionalflow.co.uk/blog/2008/08/27/counting-the-number-of-messages-in-a-message-queue-in/
/// </remarks>
public static int GetCount(this MessageQueue self)
@ramonsmits
ramonsmits / nlogasynccode.cs
Created April 16, 2018 12:36
NLog code api async
var config = new LoggingConfiguration();
var console = new ColoredConsoleTarget();
var async = new AsyncTargetWrapper(console);
config.AddTarget("console", wrapper);
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, async));
config.DefaultCultureInfo = CultureInfo.InvariantCulture;
@ramonsmits
ramonsmits / App.config
Last active April 17, 2018 19:09
NServiceBus - File based routing (FBR) & Sender side distribution (SSD) shared configuration
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="NServiceBus/ErrorAddress" value="error"/>
<add key="NServiceBus/AuditAddress" value="audit"/>
<add key="NServiceBus/InstanceMappingFile" value="instances.xml"/>
<add key="NServiceBus/RouteMappingFile" value="routes.xml"/>
<add key="NServiceBus/MonitoringAddress" value=""/>
<!--<add key="NServiceBus/InstanceId" value="1"/>-->
</appSettings>
@ramonsmits
ramonsmits / AssignMessageIdtoLog4netNdcBehavior.cs
Last active May 16, 2018 11:29
NServiceBus log4net - Use NDC to show incoming message id
using System;
using System.Threading.Tasks;
using log4net;
using NServiceBus.Pipeline;
/// <summary>
/// Pushes the current message ID to the log4net NDC stack. When using a log4net conversation pattern containing `%ndc` then this value used ("%date [%-3thread] %-5level [%ndc] %logger - %message%newline").
/// </summary>
/// <example>
/// var pipeline = endpointConfiguration.Pipeline;
@ramonsmits
ramonsmits / AssignMessageIdtoNLogNdlcBehavior.cs
Last active March 25, 2021 16:57
NServiceBus NLog - Use incoming message id for the Nested Diagnostics Logical Context (NDLC)
class AssignMessageIdtoNLogNdlcBehavior : Behavior<ITransportReceiveContext>
{
public override async Task Invoke(ITransportReceiveContext context, Func<Task> next)
{
var headers = context.Message.Headers;
headers.TryGetValue(Headers.ConversationId, out var conversationId);
headers.TryGetValue(Headers.CorrelationId, out var correlationId);
using (NLog.NestedDiagnosticsLogicalContext.Push(context.Message.MessageId))
using (MappedDiagnosticsLogicalContext.SetScoped(Headers.ConversationId, conversationId))
@ramonsmits
ramonsmits / NServiceBusAppender.cs
Created May 15, 2018 19:38
Proof of concept to use NServiceBus as a lognet appender
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using log4net.Appender;
using log4net.Core;
using NServiceBus;
[Obsolete("This is a proof of concept! It is not advisable to use this appender in a hot path! It probably is better to use something more lightweight as https://www.nuget.org/packages/log4net.Appender.Msmq/")]
class NServiceBusAppender : AppenderSkeleton
@ramonsmits
ramonsmits / SerializedHandler.cs
Created May 17, 2018 13:30
NServiceBus serialized handler
using System;
using System.Threading;
using System.Threading.Tasks;
using NServiceBus;
class SerializedHandler : IHandleMessages<MyMessage>
{
static readonly SemaphoreSlim sequentialAccess = new SemaphoreSlim(1);
static readonly TimeSpan waitDuration = TimeSpan.FromSeconds(5);
@ramonsmits
ramonsmits / nsb6loglevelconfig.cs
Created June 21, 2018 15:05
Set log level in NServiceBus 7 via AppSetting
var logLevelValue = ConfigurationManager.AppSettings["NServiceBus/Logging/LogLevel"];
var logLevel = (LogLevel)Enum.Parse(typeof(LogLevel), logLevelValue);
var defaultFactory = LogManager.Use<DefaultFactory>();
defaultFactory.Level(LogLevel);
@ramonsmits
ramonsmits / SequentialProcessingByMessageTypeBehavior.cs
Created July 3, 2018 13:28
NServiceBus behavior that results in incoming messages of the same type to be processed sequentially even though the endpoint is configured for concurrent processing
/// <summary>
/// Usage:
/// endpointConfiguration.Pipeline.Register(new SequentialProcessingByMessageTypeBehavior(), "Processes incoming messages of the same type sequentially.");
/// </summary>
class SequentialProcessingByMessageTypeBehavior : IBehavior<IIncomingPhysicalMessageContext, IIncomingPhysicalMessageContext>
{
TimeSpan Timeout = TimeSpan.FromSeconds(1);
ConcurrentDictionary<string, SemaphoreSlim> semaphores = new ConcurrentDictionary<string, SemaphoreSlim>();
public async Task Invoke(IIncomingPhysicalMessageContext context, Func<IIncomingPhysicalMessageContext, Task> next)
@ramonsmits
ramonsmits / UpdateDataInDifferentCatalogHandler.cs
Created July 11, 2018 19:13
NServiceBus - Use different database catalog on same database server instance with connection sharing
using System.Data.Entity;
using System.Threading.Tasks;
using NServiceBus;
public class UpdateDataInDifferentCatalogHandler
: IHandleMessages<CompleteOrder>
{
public async Task Handle(MyMessage message, IMessageHandlerContext context)
{
var sharedSession = context.SynchronizedStorageSession.SqlPersistenceSession();