RabbitMQ:
RabbitMQ is a complete and highly reliable enterprise messaging system based on the emerging AMQP standard. It is licensed under the open source Mozilla Public License and has a platform-neutral distribution, plus platform-specific packages and bundles for easy installation. (http://www.rabbitmq.com/)Symbiote:
Symbiote is a set of libraries that reduce the radius of comprehension by providing simplified APIs "...to some of the better open source libraries available" as well as "...a way to centralize the configuration [and] dependency injection..." of said libraries (Robson, A., Symbiote).
For those of you who haven't played with RabbitMQ and/or Symbiote, I strongly recommend checking them out!
Code:
Here's the code with the CouchDB interaction functionality as well as the RabbitMQ publish/subscribe functionality.
A couple of things to note about this sample:
1. CouchDB and RabbitMQ must be installed and running on the local machine.
2. Since Symbiote is under heavy development, the CouchDB related code has changed slightly from the example provided last week.
module Progam
open System
open Symbiote.Core
open Symbiote.Relax
open Symbiote.Daemon
open Symbiote.Jackalope
open Symbiote.Jackalope.Impl
type PersonCouchDocument =
val id : string
val mutable name : string
val mutable address : string
inherit DefaultCouchDocument
new (id, name, address) =
{id = id; name = name; address = address} then base.DocumentId <- id
member x.Name
with get () = x.name
member x.Address
with get () = x.address
type HandleMessage() =
interface IMessageHandler<PersonCouchDocument> with
member x.Process (message:PersonCouchDocument, messageDelivery:IMessageDelivery) =
Console.WriteLine("Processing message for person {0}.", message.name)
messageDelivery.Acknowledge()
type DemoService =
val couchServer : ICouchServer
val bus : IBus
new(couchServer, bus) as this =
{couchServer = couchServer; bus = bus} then this.Initialize()
member public x.Initialize () =
x.bus.AddEndPoint(fun x ->
x.Exchange("SymbioteDemo", ExchangeType.fanout).QueueName("SymbioteDemo")
.Durable().PersistentDelivery() |> ignore)
interface IDaemon with
member x.Start () =
do Console.WriteLine("The service has started")
x.bus.Subscribe("SymbioteDemo", null)
let document = new PersonCouchDocument("123456", "John Doe", "123 Main")
x.couchServer.Repository.Save(document)
x.bus.Send("SymbioteDemo", document)
let documentRetrieved =
x.couchServer.Repository.Get<PersonCouchDocument>(document.DocumentId);
do Console.WriteLine(
"The document with name {0} and address {1} was retrieved successfully",
documentRetrieved.Name, documentRetrieved.Address)
do x.couchServer.DeleteDatabase<PersonCouchDocument>()
member x.Stop () =
do Console.WriteLine("The service has stopped")
do Assimilate
.Core()
.Daemon(fun x -> (x.Name("FSharpDemoService")
.DisplayName("An FSharp Demo Service")
.Description("An FSharp Demo Service")
.Arguments([||]) |> ignore))
.Relax(fun x -> x.Server("localhost") |> ignore)
.Jackalope(fun x -> x.AddServer(fun s -> s.Address("localhost").AMQP08() |> ignore) |> ignore)
.RunDaemon()
Conclusion:
As mentioned previously, with the help of Symbiote it only takes a dozen or so additional lines of code to add support for RabbitMQ to our previous example. The complete source for this solution can be found at http://github.com/dmohl/Symbiote-Jackalope-Example.
No comments:
Post a Comment