Don't worry, we're all at that place once (I feel at times I still am), well maybe apart from the good people at the Muse team.
/Lenni -----Original Message----- From: Marco Parmiani [mailto:[EMAIL PROTECTED] Sent: 18 April 2007 09:52 To: [email protected] Subject: Re: Regarding Muse Topics and subscriptions 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] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
