WS-Eventing implementation deployed!

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.

Comments are closed.