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.
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…
The BBC article "How we fell out of love with voice assistants" by Katherine Latham…
Like so many others out there, I played a bit with ChatGPT. I noticed examples…