Thanks, I'm going to try it out.
Thanks to everyone for the help, hope I can ask something more in the
future, I really am a 'newbie' here.

Marco

2007/4/17, [EMAIL PROTECTED] <[EMAIL PROTECTED]>:
I tried to replicate your problem (mine worked fine) and I think I might
have some ideas for you.

Try to put this code into you accept function before you topic.equal
statement:

QName _TOPIC_NAME_SENDER = message.getTopic();
                System.out.println("_TOPIC_NAME_SENDER:
"+_TOPIC_NAME_SENDER.toString());
                Collection MessageContentNames =
message.getMessageContentNames();
                if(MessageContentNames.isEmpty() != true)
                {
                        int size = MessageContentNames.size();
                        Object[] MessageContentNamesObject =
MessageContentNames.toArray();
                        for(int i = 0; i < size; i++)
                        {

System.out.println("MessageContentNamesObject:
"+MessageContentNamesObject[i].toString());
                                System.out.println("MessageContent:
"+MessageContent.toString());
                        }
                }
System.out.println("Message topic equal to control topic?
"+_TOPIC_NAME_TEST.equals(_TOPIC_NAME_SENDER));

This should get you a printout in your tomcat commandline that looks a
bit like this:

_TOPIC_NAME_SENDER:
{http://ws.example.com/muse/test/notification}MyTopic
MessageContentNamesObject:
{http://ws.example.com/muse/test/notification}MyParameterUpdate
MessageContent: [tns:MyParameterUpdate: null]
Message topic equal to control topic? True


I used for the producer:

public void publishWsrfNotification(){          //
//       you can later publish messages to the topic
        //
//      QName messageName = new
QName("http://example.com/server-product";, "UpdateMessage");
        QName messageName = new
QName("http://ws.example.com/muse/test/notification";,
"MyParameterUpdate", "tns");
        Element payload = XmlUtils.createElement(messageName,
"MyParameter has been updated.");
        try {
                        wsn.publish(_TOPIC_NAME, payload);
                } catch (SoapFault e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
    }

And for JUnit test you should use the <resource>.update<parameter> and
not set<parameter> to access any set<parameter functions within the
capability of the producer.


public void testWEF()throws SoapFault, IOException {
                String temp = clientResource.getServerName();
                int interval = clientResource.getMessageInterval();
        clientResource.updateMessageInterval(60);
        clientResource.setTrace(true);
        }


Hope it helps

/Lenni
-----Original Message-----
From: Marco Parmiani [mailto:[EMAIL PROTECTED]
Sent: 17 April 2007 15:54
To: [email protected]
Subject: Re: Regarding Muse Topics and subscriptions

Found an answer to this from the reference manual:
" If you add the  WSN NotificationProducer capability  to your
resource type, it will automatically send out WSRP change
notifications  every time the WSRP SetResourceProperties operation is
used to modify a property.  It also creates a WSN topic for each
resource property so that clients can  subscribe to notifications
about individual properties, with the topic name being  equal to the
property name. In other words, for changes made via WSRP, you don't
have to do anything!"

What happens is that when I update MyParameter, the frameworks sends
by default WSRP change notifications using topic name equal to the
property name. This is why the event topic I get using
message.getTopic()  is
http://ws.example.com/muse/test/notification}MyParameter.

What I cannot understand is why I cannot send notification explicitly
from my setMyParameter method as shown in the code I wrote. The
consumer should receive both notification (one is the 'default' WSRP
change notification -topic=MyParameter- and one is my explicit
notification -topic=MyTopic-).
The consumer does not even receive the latter one (I print in a file
every message I receive in my accept() method).

2007/4/17, Marco Parmiani <[EMAIL PROTECTED]>:
> I probably used some inappropriate words, but I understood that the
producer 'sends' events to the subscribers, and that publisher and
subscribers are on separate processes (so no exception catch mechanism,
sorry again for that).
>
> I'll try to be more clear.
> My problem it's at the point 3: in my Producer, in a method
setMyParameter, I use wsn.publish(_TOPIC_NAME, payload), where
_TOPIC_NAME is MyTopic (excluding prefix and namespace).
> My Consumer subscribes to the Producer with
producer.subscribe(consumer, null, null); (all events sent to the
consumer).
> Within the Consumer I want to process only events sent with topic
"MyTopic" (in this simple example it's not very useful since every event
generated in Producer should be of topic "MyTopic", but it's just for
test) and therefore I write in my accept():
>
>     public boolean accepts(NotificationMessage message)
>     {
>      // should accept only messages whose topic is MyTopic
>        QName tn = message.getTopic();
>        return topicname.equals(tn);
>     }
>
> If I print message.getTopic() I get:
http://ws.example.com/muse/test/notification}MyParameter (? the events
generated in the Producer should use MyTopic see the code in my first
post) and the equal returns false (because topicname is previously set
to
>
> topicname = new QName(NAMESPACE_URI, "MyTopic", PREFIX);
>
>  Could you tell me if I understood the mechanism now or if I
misunderstood again?
>
> Thanks,
> Marco
>
>
> 2007/4/17, Daniel Jemiolo <[EMAIL PROTECTED] >:
>
> > I think you're confusing the potential exceptions thrown by the
publish()
> > method with the way events are published to consumers. When you say
the
> > events are "thrown", that makes me think of how the exceptions are
thrown
> > (if there's an error), but that happens on the producer side and
won't be
> > seen by a consumer. If you want to receive messages from a consumer,
you
> > need to:
> >
> > 1. create a subscription using
NotificationProducerClient.subscribe(),
> > where the EPR you provide is the EPR of the consumer
> >
> > 2. add the NotificationConsumer capability to your consumer resource
(add
> > the Notify operation to your WSDL)
> >
> > 3. create a NotificationMessageListener that returns 'true' in
accepts()
> > if the current message has your topic.
> >
> > All of this should work when producer and consumer are in two
completely
> > separate processes, and there is no way for a consumer to "catch"
anything
> > from the call to publish().
> >
> > Dan
> >
> >
> >
> > "Marco Parmiani" <[EMAIL PROTECTED]> wrote on 04/16/2007
02:38:06
> > PM:
> >
> > > Thanks for the reply.
> > > However the use of the 'old' topic is intentional:  what I'd like
to do
> > is
> > > to throw events in the MyTopic topic from within the
setMyParameter
> > method.
> > > Therefore I call:
> > >
> > > public void setMyParameter(int param0) {
> > > _MyParameter = param0;
> > > QName messageName = new QName(NAMESPACE_URI, "MyParameterUpdate",
> > PREFIX);
> > > Element payload = XmlUtils.createElement(messageName, "MyParameter
has
> > been
> > > updated.");
> > > wsn.publish(_TOPIC_NAME, payload);
> > > }
> > >
> > > I really can't understand why if I call  message.getTopic() from a
> > consumer
> > > application, I get
> > >
> > {http://ws.example.com/muse/test/notification}MyParameter<
http://ws.example.
> > > com/muse/test/notification%7DMyParameter>(I
> > > expected MyTopic or eventually MyParameterUpdate,
> > > but not MyParameter that is the name of the property).
> > >
> > > The thing is shown here: (from:
> > >
> >
http://ws.apache.org/muse/docs/2.0.0/manual/how-to/publish-any-notificat
ion.html
> > > )
> > >
> > > // you can add topics programmatically or via RMD document
> > > //
> > > QName topicName = new QName("http://example.com/server-product";,
> > > "ServerUpdates");
> > > wsn.addTopic(topicName);
> > >
> >  > //
> > > // you can later publish messages to the topic
> > > //
> > > QName messageName = new QName("http://example.com/server-product";,
> > > "UpdateMessage");
> > > String updateMessage = "Something important happened!";
> > > Element payload = XmlUtils.createElement(messageName,
updateMessage);
> > >
> > > wsn.publish(topicName, payload);
> > >
> > > The code publishes a message ('UpdateMessage) with description
> > ("Something
> > > important happened") to a previously defined Topic. That is
exactly what
> > I'm
> > > trying to do. And I expect that a consumer application catches and
> > processes
> > > these events if I write into the accept() method:
> > >
> > > QName topicName = new QName("http://example.com/server-product";,
> > > "ServerUpdates");
> > > QName tn = message.getTopic();
> > > return  topicName.equals(tn);
> > >
> > > This method should return TRUE if events generated with the code
above,
> > but
> > > in my case does not.
> > > Am I understanding correctly the use of topics and subscriptions?
> >  >
> > > Thanks in advance,
> > > Marco
> > >
> > > 2007/4/16, [EMAIL PROTECTED] <[EMAIL PROTECTED]>:
> > > >
> > > > I believe that you setup for your NotificationProducer in your
> > "Runtime"
> > > > event is the part causing you the problem.
> > > >
> > > > The code below should help, as far as I see it your still
publishing
> > > > with your old topic [wsn.publish(_TOPIC_NAME, payload);]
> > > >
> > > >
> > > >
> > > > QName messageName = new QName(NAMESPACE_URI,
"MyParameterUpdate",
> > > > PREFIX);
> > > > Wsn.addTopic(messageName);
> > > > Element payload =  XmlUtils.createElement(messageName,
"MyParameter has
> > > > been
> > > > updated.");
> > > >   try {
> > > >     wsn.publish (messageName, payload);
> > > >   } catch (Throwable error) {
> > > >     error.printStackTrace();
> > > >   }
> > > >
> > > >
> > > > /Lenni
> > > >
> > > > -----Original Message-----
> > > > From: Marco Parmiani [mailto: [EMAIL PROTECTED]
> > > > Sent: 16 April 2007 15:50
> > > > To: [email protected]
> > > > Subject: Regarding Muse Topics and subscriptions
> > > >
> > > > Hello, I'm quite new to Muse and I'd like to better understand
the
> > > > Topics
> > > > mechanism.
> > > >
> > > > This is what I've done:
> > > > I took the wsdl included in wsn-producer example (added a new
> > parameter,
> > > > called MyParameter), followed the tutorial on the site and
generated
> > > > correctly the classes (and the war file).
> > > > For the Topic name I specified:
> > > > // NAMESPACE_URI = "
http://ws.example.com/muse/test/notification";,
> > > > PREFIX
> > > > ="tns"
> > > > private static final QName _TOPIC_NAME = new
QName(NAMESPACE_URI,
> > > > "MyTopic",
> > > > PREFIX);
> > > >
> > > > and into initializeCompleted() I added:
> > > >
> > > > wsn =
> > > >
(NotificationProducer)res.getCapability(WsnConstants.PRODUCER_URI );
> > > > wsn.addTopic(_TOPIC_NAME);
> > > >
> > > > In setMyParameter(int param0) method I added the code for
'throwing'
> > new
> > > > events:
> > > >
> > > > QName messageName = new QName(NAMESPACE_URI,
"MyParameterUpdate",
> > > > PREFIX);
> > > > Element payload = XmlUtils.createElement(messageName,
"MyParameter has
> > > > been
> > > > updated.");
> > > >   try {
> > > >     wsn.publish(_TOPIC_NAME, payload);
> > > >   } catch (Throwable error) {
> > > >     error.printStackTrace();
> > > >   }
> > > >
> > > > Now, from what I understand that code will throw new events on
the
> > Topic
> > > > named MyTopic. These events are messages named MyParameterUpdate
and
> > > > they
> > > > include my description "MyParameter has been updated".
> > > > The problem is that when I use the wsn-consumer (a little bit
> > > > customized) I
> > > > do not get the result I expect:
> > > >
> > > > ConsumerCapabilityImpl.java:
> > > > // ...imports and class def
> > > > private QName topicname = null;
> > > > String PREFIX = "tns";
> > > > String NAMESPACE_URI = "
http://ws.example.com/muse/test/notification";;
> > > >     public void initializeCompleted()
> > > >         throws SoapFault
> > > >     {
> >  > >         super.initializeCompleted();
> > > >
> > > >         topicname = new QName(NAMESPACE_URI, "MyTopic", PREFIX);
> > > >
> > > >         NotificationConsumer wsn =
> > > >
> >
(NotificationConsumer)getResource().getCapability(WsnConstants.CONSUMER_
> > > > URI);
> > > >         wsn.addMessageListener(this);
> > > >     }
> > > >
> > > >     public boolean accepts(NotificationMessage message)
> > > >     {
> > > >      // should accept only messages whose topic is MyTopic
> > > >        QName tn = message.getTopic();
> > > >        return topicname.equals(tn);
> > > >     }
> > > >
> > > >     public void process(NotificationMessage message)
> > > >     {
> > > >         getLog().info("Received message:\n\n" + message);
> > > >     }
> > > >
> > > > If I print the  message.getTopic() I get:
> > > > {http://ws.example.com/muse/test/notification}MyParameter and
not
> > > > MyTopic
> > > > (and consequently the process() method does not get called)...In
> > > > addition,
> > > > if I look the soap messages stores in the logfile of the
consumer, I
> > do
> > > > not
> > > > see anywhere neither "MyParameterUpdate" (the name of the
message I
> >  set
> > > > up
> > > > in setMyParameter) nor "MyParameter has been updated." Could
anyone
> > > > explain
> > > > to me this behaviour?
> > > > What's the difference between the use of accept() method into
the
> > > > consumer
> > > > application and the use of  producer.subscribe(consumer, new
> > > > TopicFilter(qname),null) in the external class that subscribes
the
> > > > consumer
> > > > to the producer?
> > > >
> > > > Thanks and sorry for the long post,
> > > > Marco
> > > >
> > > >
> > > >
---------------------------------------------------------------------
> > > > 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]
> > > >
> > > >
> >
> >
> >
---------------------------------------------------------------------
> > 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]


---------------------------------------------------------------------
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]

Reply via email to