The NotificationConsumer implementation handles the firing of
NotificationMessageListeners for each message received throughthe Notify
operation. These NotificationMessageListener objects can be registered at
any time using the NotificationConsumer's add/removeListener() methods.
The objects do *not* have to be capability implementations - they just
have to implement the NotificationMessageListener interface. Normal Java
stuff.
In the wsn-consumer example, there is not much code, so I just made the
capability double as the listener and add itself (addListener(this)). I
could have also created a separate class, instantiated it, and added that
object with addListener(). Either way is fine. For more complicated
listeners, the latter is probably better.
To make it so that a listener only executes its tasks for a specific
producer, you need to implement the NotificationMessageListener.accepts()
method such that the producer's EPR is taken into consideration. Something
like:
----------------- start sample code ----------------------
public class MyListener implements NotificationMessageListener
{
public boolean accepts(NotificationMessage message)
{
EndpointReference producer =
message.getProducerReference();
// test EPR content to verify producer's identity
}
public void processMessage(NotificationMessage message)
{
// this is only called if accepts() returns 'true'
}
}
----------------- end sample code ------------------------
If you are filtering based on producer, I imagine you are going to add
some constructor code that will allow you to tell the object what
producer(s) it is responding to.
Of course, if you have one WS-resource instance responding to
notifications from multiple resource types, I imagine the topics and
message patterns of the events will be quite different... a more robust
solution might be to filter based on the topics or XPath. Also, since you
can add/remove listeners at any time, you can also create listeners for a
specific subscription, at the time of the subscription:
----------------- start sample code ----------------------
public class MySubscriptionListener implements NotificationMessageListener
{
private EndpointReference _mySubscription = null;
public MySubscriptionListener(EndpointReference subscription)
{
_mySubscription = subscription;
}
public boolean accepts(NotificationMessage message)
{
EndpointReference subscription =
message.getSubscriptionReference();
return _mySubscription.equals(subscription);
}
public void processMessage(NotificationMessage message)
{
...
}
}
...
//
// code to make a subscription and then create a listener for it
//
NotificationProducerClient producer = new NotificationProducerClient(...);
SubscriptionClient subscription = producer.subscribe(...);
EndpointReference subEPR = subscription.getEndpointReference();
MySubscriptionListener listener = new MySubscriptionListener(subEPR);
NotificationConsumer nc =
getResource().getCapability(WsnConstants.CONSUMER_URI);
nc.addListener(listener);
----------------- end sample code ------------------------
Does this clarify your options?
Dan
"Vinh Nguyen \(vinguye2\)" <[EMAIL PROTECTED]> wrote on 12/06/2006
03:42:54 AM:
> In the wsn-consumer example, the code shows how to register a resource
> as a notification consumer. Then, to receive the notifications, the
> NotificationMessageListener interface must be implemented. In the
> example, this is done by a ConsumerCapabilityImpl capability class
> associated with the "consumer" resource.
>
> My question is: how does Muse know what resource component to call in
> order to pass the notification message? Does it scan thru the consumer
> resource's list of capability classes and invoke the one the implements
> the NotificationMessageListener interface? The muse.xml descriptor file
> doesn't seem to have a place to explicitly tell Muse what class to call,
> but somehow Muse knows already.
>
> So what happens if my resource has 2 capability classes, both of which
> are NotificationMessageListeners. How does Muse know which one to call?
>
> There's also the case where each of the 2 capability classes can be
> listening to notifications from different producers (i.e. different Muse
> applications).
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]