This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jan 4, 2022. It is now read-only.

Latest commit

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

#Burrows

Burrows is a .Net service bus based on the popular MassTransit service bus.

What is the difference? Burrows is .Net 4.5 and up. Why? Because we wanted to make better use of the Async/Await and the related extensions. Yes we understand that Async can now be added in .Net 4.0 via the Async Targetting Pack...but we're sticking with 4.5 for now.

Burrows is RabbitMQ only whereas MassTransit covers a variety of transports. This allows Burrows to simplify the codebase substantially in order to focus exclusively on Rabbit. As a result, Burrows provides a more full featured implementation of Rabbit including better support for publisher confirms while retaining the awesome polymorphic MassTransit routing setup.

##How Do I Get Started?

The first thing to know is how to set up a publisher and publish a message.

###Set up the publisher: The easiest way to set up a publisher is with the following command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"));

This command will set up the publisher to listen at the specified endpoint, but will also instruct the publisher to use a control bus.
It is synonymous with this command:

var publisher = new Publisher(sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole")
.UseRabbitMq().UseLog4Net());

There are many extensions available to customize bus behavior and they are all chainable.

####What if I want to use Publisher Confirms? Publisher confirms allow RabbitMQ publishers to ensure that messages got to the Rabbit broker. Although it's an edge case, it is always possible that RabbitMQ may begin nacking messages if the broker begins experiencing issues. If a Nack is encountered, it's likely that some manual intervention will be required on the broker, making it important to handle this situation and prevent message loss. In addition, there are situations such as simple network outages that may cause the publisher to lose connectivity to the Rabbit broker. Because Rabbit is a broker architecture, it's up to you to figure out what to do with the these messages. The publisher can keep them in memory, but this could soon become overwhelming.

Burrows includes some automatic mechanisms for offloading messages and then retrying them in the event of a broker Nack or network outage. The publisher will store the messages on the file system and then attempt to retry them in roughly the same order they came in. It is possible to implement other storage mechanisms as well, but the file system is the most basic and available should a network outage occur.

####Set up publisher Confirms:

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); 

The second constructor parameter to the publisher enables publisher confirms to a file backing store:

ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup") 

The call to UsePublisherConfirms accepts an argument which tells this publisher what to call the storage area where these messages will be stored and retrieved. Typically, this would be based on the name of the publisher. The extension WithFileBackingStore tells the publisher to store messages on the file system at the root location specified. The account the publisher runs under must have persmissions to write and create directories under this root location to organize messages.

####So publisher confirms are set up...how do I republish failed messages? If the publisher is still running, it will check at intervals to determine if Rabbit has again become available for publication and will start publishing again immediately. However, if the publisher also goes down, how to I republish stored messages at startup? Just call RepublishStoredMessages() on the publisher after instantiation.

var publisher = new Publisher(
sbc => sbc.Configure(@"rabbitmq://localhost/PublishConsole"),
ps => ps.UsePublisherConfirms("PublishConsole").WithFileBackingStore("C:\MessageBackup")); publisher.RepublishStoredMessages();

###OK, I published something...how do I Consume it I'll save the details of how Burrows and RabbitMQ deliver messages to a longer blog post, but Burrows is based on the fantastic work that was put into MassTransit to allow polymorphic message consumption. The first thing to do is set up a consumer service, typically using TopShelf to help. Having done that, you will need to configure the service bus on the consumer to receive messages. Consumer setup is almost always going to be used in coordination with an IOC Container, and Burrows currently supports Autofac. The below approach can be modified, but this is demonstrated using an Autofac module to register the service bus.

public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Register all of the consumers
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Implements<IConsumer>())
.AsSelf();
//Register the service bus itself
builder.Register(c => ServiceBusFactory.New(
sbc => sbc.Configure(@"rabbitmq://localhost/SubscribeConsole",
subs => subs.LoadFrom(c.Resolve<ILifetimeScope>())))).SingleInstance();
//This is the same as:
//builder.Register(c => ServiceBusFactory.New(sbc =>
//{
// sbc.ReceiveFrom(@"rabbitmq://localhost/SubscribeConsole");
// sbc.UseRabbitMq();
// sbc.UseControlBus();
// sbc.Subscribe(subs => subs.LoadFrom(c.Resolve<ILifetimeScope>()));
//})).SingleInstance();
}
}

In the preceding code, the consumers are all registered with Autofac as classes that implement IConsumer. The second section of code sets up the service bus. Note that the service bus needs a queue to consume from, and in addition, it needs an action to give it a source of subscribers/consumers. This source will be used to provide instances of the consumers to the service bus when handling messages. The commented section of code shows all of the more detailed calls that are wrapped by the Configure method.

The final step in consuming is to create a Consumer. A consumer is a basic class that inherits from the Consumes class. All messages that are satisfied by the "Consumes" type will be routed to this hander. So in the case below, that would include all messages of the SimpleMessage type or all messages that SimpleMessage inherits from or impements (interfaces and classes will work).

public class SubscribeConsoleConsumer : Consumes<SimpleMessage>.All
{
public void Consume(SimpleMessage message)
{
Console.WriteLine("Just got a message");
}
}

Other Helpful Things

There are now Rabbit utility command classes available under Burrows.RabbitCommands. These are: Load, Move, Purge, and Save commands for operating directly on a Rabbit Queue.

Change Log

0.3.1.0

  • Removed async saving from publisher confirms because this sometimes caused thread locking from the publisher constructur and the method was always being waited anyway. Planning on a better more full implementation of async from the publisher in the future.
  • Removed RepublishStoredMessages() from the publisher constructure and added it to the IPublisher interface. This must now be called (it is not automatically called in the constructor of the publisher).
  • Added Rabbit command classes.

About

Burrows

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages