You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-user@ws.apache.org by dnguyen <do...@l-3comcept.com> on 2007/03/07 23:36:56 UTC

Re: wsn consumer

Hi Dan.  Is there a way to getResource() without extending
AbstractCapability?  I am thinking that ConsumerCapabilityImpl in
wsn-consumer sample is instantiated only once, and I need to have separate
MessageListener(s) to call NotificationConsumer.addMessageListener() when
they get instantiated.


Daniel Jemiolo wrote:
> 
> 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\)" <vi...@cisco.com> 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: muse-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: muse-user-help@ws.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/wsn-consumer-tf2766808.html#a9363921
Sent from the Muse User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-user-help@ws.apache.org


Re: WSN messages issue

Posted by Daniel Jemiolo <da...@us.ibm.com>.
Does the original sample do this? I haven't noticed because last time I 
ran the sample (yesterday), it worked, and duplicate prefix declarations 
cause Xerces to throw an exception. If the new code is what triggered the 
duplicate, send it along and I'll see if I can figure it out.

thanks,
Dan



<le...@bt.com> wrote on 03/09/2007 11:03:43 AM:

> Hi Guys
> 
> During a test on the actual WSN message sent out from our producer, we
> noticed that the message contains a duplicate of the
> xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" in the namespace.
> 
> Attached xml document with the WSN message.
> 
> This print out is from a modified version of the WSN-consumer example.
> 
> I'll be happy to provide more code if needed.
> 
> /Lenni
> [attachment "notificationTrace.xml" deleted by Daniel 
Jemiolo/Durham/IBM] 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: muse-user-help@ws.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-user-help@ws.apache.org


WSN messages issue

Posted by le...@bt.com.
Hi Guys

During a test on the actual WSN message sent out from our producer, we
noticed that the message contains a duplicate of the
xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" in the namespace.

Attached xml document with the WSN message.

This print out is from a modified version of the WSN-consumer example.

I'll be happy to provide more code if needed.

/Lenni

Re: wsn consumer

Posted by Daniel Jemiolo <da...@us.ibm.com>.
Why not keep the ConsumerCapability that's in wsn-consumer today and have 
it add all the MessageListeners that you've created? For example, if you 
had three MessageListener classes, each of which responded to a different 
type of notification, you could do the following:


public class ConsumerCapabilityImpl 
        extends AbstractCapability implements ConsumerCapability
{
        public void initialize()
                throws SoapFault
        {
                super.initialize();
 
                NotificationConsumer wsn = 
getResource().getCapability(WsnConstants.CONSUMER_URI);

                wsn.addMessageListener(new ListenerClass1());
                wsn.addMessageListener(new ListenerClass2());
                wsn.addMessageListener(new ListenerClass3());
        }
}


So, ConsumerCapability would have no properties or operations, but still 
serves an important function in your resource definition. You might want 
to change the name to clarify its purpose.

Dan


dnguyen <do...@l-3comcept.com> wrote on 03/07/2007 06:06:06 PM:

> 
> What I am trying to do is for a given resource deployment (wsn-consumer 
for
> example) I need to have varied number of MessageListeners.  Since
> ConsumerCapabilityImpl is the only MessageListener, I pulled the
> MessageListener into a separate class, so multiple instances can be 
created
> based on other events occuring outside Muse.  This lead me to the
> MessageListener class needing to get a hold of the resource's
> NotificationConsumer capability to call addMessageListener().  There 
does
> not seem to be a way through the Muse API to do so.  It seems I may have 
to
> resort to a Singleton to get hold of it.  Is this a correct assumption?
> 
> 
> Daniel Jemiolo wrote:
> > 
> > I'm not sure I understand how the question and the statement are 
> > related... as far as getResource() and AbstractCapability are 
concerned, 
> > the only requirement on your capability classes is that they implement 

> > org.apache.muse.core.Capability. The AbstractCapability class provides 
an 
> > implementation of all the "boring" parts of the Capability interface - 
the 
> > getter/setter methods and the default initialize/shutdown routines 
(which 
> > are empty). You can certainly create a capability class without it, 
but 
> > you'll need to fill in all of these methods yourself.
> > 
> > Can you explain your notification issue again? In the sample, 
> > ConsumerCapabilityImpl will be instantiated once for each consumer 
> > resource; there is only one consumer resource created in the current 
> > sample app, but if you added more EPRs to 
/WEB-INF/classes/router-entries, 
> > you could have more consumer instances. Let me know what you're trying 
to 
> > do.
> > 
> > Dan
> > 
> > 
> > 
> > dnguyen <do...@l-3comcept.com> wrote on 03/07/2007 05:36:56 PM:
> > 
> >> 
> >> Hi Dan.  Is there a way to getResource() without extending
> >> AbstractCapability?  I am thinking that ConsumerCapabilityImpl in
> >> wsn-consumer sample is instantiated only once, and I need to have 
> > separate
> >> MessageListener(s) to call NotificationConsumer.addMessageListener() 
> > when
> >> they get instantiated.
> >> 
> >> 
> >> Daniel Jemiolo wrote:
> >> > 
> >> > 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\)" <vi...@cisco.com> 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: muse-user-unsubscribe@ws.apache.org
> >> > For additional commands, e-mail: muse-user-help@ws.apache.org
> >> > 
> >> > 
> >> > 
> >> 
> >> -- 
> >> View this message in context: 
> > http://www.nabble.com/wsn-consumer-tf2766808.html#a9363921
> >> Sent from the Muse User mailing list archive at Nabble.com.
> >> 
> >> 
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> >> For additional commands, e-mail: muse-user-help@ws.apache.org
> >> 
> > 
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: muse-user-help@ws.apache.org
> > 
> > 
> > 
> 
> -- 
> View this message in context: 
http://www.nabble.com/wsn-consumer-tf2766808.html#a9364550
> Sent from the Muse User mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: muse-user-help@ws.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-user-help@ws.apache.org


Re: wsn consumer

Posted by dnguyen <do...@l-3comcept.com>.
What I am trying to do is for a given resource deployment (wsn-consumer for
example) I need to have varied number of MessageListeners.  Since
ConsumerCapabilityImpl is the only MessageListener, I pulled the
MessageListener into a separate class, so multiple instances can be created
based on other events occuring outside Muse.  This lead me to the
MessageListener class needing to get a hold of the resource's
NotificationConsumer capability to call addMessageListener().  There does
not seem to be a way through the Muse API to do so.  It seems I may have to
resort to a Singleton to get hold of it.  Is this a correct assumption?


Daniel Jemiolo wrote:
> 
> I'm not sure I understand how the question and the statement are 
> related... as far as getResource() and AbstractCapability are concerned, 
> the only requirement on your capability classes is that they implement 
> org.apache.muse.core.Capability. The AbstractCapability class provides an 
> implementation of all the "boring" parts of the Capability interface - the 
> getter/setter methods and the default initialize/shutdown routines (which 
> are empty). You can certainly create a capability class without it, but 
> you'll need to fill in all of these methods yourself.
> 
> Can you explain your notification issue again? In the sample, 
> ConsumerCapabilityImpl will be instantiated once for each consumer 
> resource; there is only one consumer resource created in the current 
> sample app, but if you added more EPRs to /WEB-INF/classes/router-entries, 
> you could have more consumer instances. Let me know what you're trying to 
> do.
> 
> Dan
> 
> 
> 
> dnguyen <do...@l-3comcept.com> wrote on 03/07/2007 05:36:56 PM:
> 
>> 
>> Hi Dan.  Is there a way to getResource() without extending
>> AbstractCapability?  I am thinking that ConsumerCapabilityImpl in
>> wsn-consumer sample is instantiated only once, and I need to have 
> separate
>> MessageListener(s) to call NotificationConsumer.addMessageListener() 
> when
>> they get instantiated.
>> 
>> 
>> Daniel Jemiolo wrote:
>> > 
>> > 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\)" <vi...@cisco.com> 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: muse-user-unsubscribe@ws.apache.org
>> > For additional commands, e-mail: muse-user-help@ws.apache.org
>> > 
>> > 
>> > 
>> 
>> -- 
>> View this message in context: 
> http://www.nabble.com/wsn-consumer-tf2766808.html#a9363921
>> Sent from the Muse User mailing list archive at Nabble.com.
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
>> For additional commands, e-mail: muse-user-help@ws.apache.org
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: muse-user-help@ws.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/wsn-consumer-tf2766808.html#a9364550
Sent from the Muse User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-user-help@ws.apache.org


Re: wsn consumer

Posted by Daniel Jemiolo <da...@us.ibm.com>.
I'm not sure I understand how the question and the statement are 
related... as far as getResource() and AbstractCapability are concerned, 
the only requirement on your capability classes is that they implement 
org.apache.muse.core.Capability. The AbstractCapability class provides an 
implementation of all the "boring" parts of the Capability interface - the 
getter/setter methods and the default initialize/shutdown routines (which 
are empty). You can certainly create a capability class without it, but 
you'll need to fill in all of these methods yourself.

Can you explain your notification issue again? In the sample, 
ConsumerCapabilityImpl will be instantiated once for each consumer 
resource; there is only one consumer resource created in the current 
sample app, but if you added more EPRs to /WEB-INF/classes/router-entries, 
you could have more consumer instances. Let me know what you're trying to 
do.

Dan



dnguyen <do...@l-3comcept.com> wrote on 03/07/2007 05:36:56 PM:

> 
> Hi Dan.  Is there a way to getResource() without extending
> AbstractCapability?  I am thinking that ConsumerCapabilityImpl in
> wsn-consumer sample is instantiated only once, and I need to have 
separate
> MessageListener(s) to call NotificationConsumer.addMessageListener() 
when
> they get instantiated.
> 
> 
> Daniel Jemiolo wrote:
> > 
> > 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\)" <vi...@cisco.com> 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: muse-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: muse-user-help@ws.apache.org
> > 
> > 
> > 
> 
> -- 
> View this message in context: 
http://www.nabble.com/wsn-consumer-tf2766808.html#a9363921
> Sent from the Muse User mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: muse-user-help@ws.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: muse-user-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-user-help@ws.apache.org