I really like travelling because I can spend more time coding. So, last week while travelling in Germany and Italy for work, I found some time to finish the WS-Eventing implementation to which I referred in previous posts (post1, post2). I am guessing that there are going to be interoperability problems with existing implementations because I chose to use the current version of WS-Addressing (March 2004) rather the one that the current WS-Eventing specification uses (March 2003).
I have made the assembly with both the source and sink implementations available (http://wsgaf.ncl.ac.uk/services/eventing/wse.dll) if anyone wishes to use it (no documentation yet apart from blog posts… perhaps will work on the documentation later). I guess it’s going to be more interesting testing interoperability with other implementations rather than downloading and using my assembly.
I have deployed a simple eventing service at http://wsgaf.ncl.ac.uk/services/eventing/eventing.ashx. You can use this endpoint as per the WS-Eventing specification minus two things for the moment: XPath support for the subscription filter and SOAP faults. When you subscribe your event sink with this service, you’ll receive a notification message every 5 seconds with the time here in Newcastle. Yes, I know… not the most useful information out there 🙂
Here’s the code for the simple program that raises this event (minus the “using” directives):
class
Program
{
static
void Main(string[] args)
{
Timer
timer = newTimer(int.Parse(args[0]));
timer.Elapsed += newElapsedEventHandler(timerElapsed);
timer.Enabled = true;
Console
.WriteLine(“Press ENTER to exit.”);
Console
.ReadLine();
}
static
void timerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
EventingSource
.RaiseEvent(newTimeInNewcastle(), newUri(“uk:ac:neresc:newcastletime:time”));
}
}
[XmlRoot(Namespace = “uk:ac:neresc:newcastletime”)]
public
class
TimeInNewcastle
{
public
DateTime
Time = DateTime.Now;
}
}
The EventingSource.RaiseEvent will do the trick.
A simple sink client that will start receiving events and then will send an “unregister” message follows:
class
Program
{
[STAThread]
static
void Main(string[] args)
{
Uri
sinkUri = newUri(“soap.tcp://localhost:10001/sink”);
Uri
serviceUri = newUri(“soap.tcp://localhost:10002/service”);
SoapReceivers
.Add(newEndpointReference(sinkUri), typeof(SinkSoapService));
SoapReceivers
.Add(newEndpointReference(serviceUri), typeof(MySoapReceiver));
Subscription
subscription = newSubscription(newUri(“http://wsgaf.ncl.ac.uk/services/eventing/eventing.ashx”));
subscription.EndTo = new uk.ac.neresc.eventing.messages.Epr(sinkUri);
subscription.NotifyTo = new uk.ac.neresc.eventing.messages.Epr(serviceUri);
subscription.Lease.Duration = newTimeSpan(0, 0, 10);
// You can even add Refernece Properties if you want here
EventingSource
.Register(subscription);
Console
.WriteLine(“Waiting for ENTER”);
Console
.ReadLine();
EventingSource
.UnRegister(subscription);
Console
.WriteLine(“Waiting for ENTER”);
Console
.ReadLine();
}
class
MySoapReceiver
: SoapReceiver
{
public
MySoapReceiver
()
{
}
protected
override
void Receive(SoapEnvelope envelope)
{
Console
.WriteLine(“Event received…”);
envelope.Body.WriteTo(new System.Xml.XmlTextWriter(Console.Out));
}
}
}
Please feel free to send me comments/questions/complaints/requests etc.
Last year, I released the "Graph Model" library for .NET as an open source project. It…
Today I'm pushing Spring Voyage out of the harbor. You can track its journey on…
In my last post, I wrote that "the typing of code was parallelized and delegated.…
In February, I wrote about the small team I'd stood up instead of hiring humans:…
Assembling a dream team without a single hire I've been making great progress on CVOYA's…
As 2025 is now behind us, I wanted to share a few reflections from my…