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 <[EMAIL PROTECTED]> 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\)" <[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]
>> > 
>> > 
>> > 
>> 
>> -- 
>> 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: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

-- 
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to