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.
See "BrainExpanded - Introduction" for context on this post. Notes and links Over the years,…
This is the first post, in what I think is going to be a series,…
Back in February, I shared the results of some initial experimentation with a digital twin.…
I am embarking on a side project that involves memory and multimodal understanding for an…
I was in Toronto, Canada. I'm on the flight back home now. The trip was…