From: Goldsack, P. <pat...@hp...> - 2004-05-28 08:59:16
|
Qinyi Thanks for spotting this - it is indeed a bug! The issue is a problem with in the lifecycle management in OnEvent which results in a sfStart part of the lifecycle of the apache action being called twice. If the event handler of OnEvent is called before its sfStart method is called (this happens in Julio's version but no your reordered one, the action will be doubly started... And hence the message put out twice. I will fix this. Patrick -----Original Message----- From: sma...@li... [mailto:sma...@li...] On Behalf Of qx...@cc... Sent: 28 May 2004 00:18 To: ju...@us... Cc: qx...@cc...; Sma...@li... Subject: RE: [Smartfrog-developer] Question for EventSend and OnEvent comp onents Hi Julio, I got it. But one thing I feel curious is that the OnEvent component in your modified component will be executed twice. The first execution time is even before the start phase of component c2. The second execution time is after component c2 starts. According to the trace information, the event from component1 has already been sent. Since event is transient, component c2 should not receive this message. In the Smartfrog workflow draft, it is said that the problem of race condition between the event being generated in one sequence and the creation of the interested component in another sequence will be fixed in the next release of the framework? Does this problem be fixed in the SmartFrog.3.02.002.beta.20040429_DIST? Is the execution of OnEvent components twice a normal thing? --------------------------------------------OUTPUT-------------------------- ------------------------ sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.228 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.251 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e1, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.286 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.296 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e1, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.298 EDT, 2004/05/27] HOST athena.cc.gatech.edu:rootProcess:event3:e1 sending apache to org.smartfrog.sfcore.workflow.components.OnEvent_Stub[RemoteStub [ref: [endpoint:[130.207.5.222:41642](local),objID:[149]]]] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.306 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.308 EDT, 2004/05/27] HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning: here--e2 sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.310 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.312 EDT, 2004/05/27] HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning: here--e2 sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e1, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event3:e1, type: normal) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:49.315 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, type: normal, description: HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04:51.323 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event3:e2, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning, type: normal, description: HOST athena.cc.gatech.edu:rootProcess:event3:e2:apache_actionRunning) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [17:04: -------------------------------------------------------------------- If I change the position of e2 and e1 as follows, it runs normally. #include "org/smartfrog/sfcore/workflow/components.sf"; #include "org/smartfrog/components.sf" event1 extends Parallel { name "apache"; actions extends LAZY { e2 extends OnEvent{ apache extends LAZY DoNothing { time 2000; message "here--e2"; } } e1 extends EventSend { sendTo:a LAZY ATTRIB e2; event (name); } } } sfConfig extends event1; --------------------------------------OUTPUT-------------------------------- -------------------- sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:20.966 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e1, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:20.974 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:21.043 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e1, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:21.082 EDT, 2004/05/27] HOST athena.cc.gatech.edu:rootProcess:event4:e1 sending apache to org.smartfrog.sfcore.workflow.components.OnEvent_Stub[RemoteStub [ref: [endpoint:[130.207.5.222:41642](local),objID:[154]]]] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning, DEPLOYING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:21.218 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning, STARTING in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:21.219 EDT, 2004/05/27] HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning: here--e2 sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e1, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event4:e1, type: normal) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:21.320 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning, type: normal, description: HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:23.324 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4:e2, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning, type: normal, description: HOST athena.cc.gatech.edu:rootProcess:event4:e2:apache_actionRunning) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:23.327 EDT, 2004/05/27] sfTrace: ROOT[3800]>HOST athena.cc.gatech.edu:rootProcess:event4, TERMINATED (Termination Record: HOST athena.cc.gatech.edu:rootProcess:event4, type: normal) in rootProcess at athena.cc.gatech.edu/130.207.5.222:3800, [19:05:23.432 EDT, 2004/05/27] > Hi Qinyi, > > > > Your description is almost correct. The problem that you had is that > apache event should be a deployable component. When wrote your > description you made apache extend LAZY. > > > > When this is resolve at runtime, apache will look like: > > > > apache > > //no sfclass for apache > > comp > > //sfClass for comp > > > > and OnEvent will try to deploy apache but it fails because there is > not sfClass > > > > You can enable tracing in the daemon modifying dist/bin/default.sf and > uncommenting the last line. > > > > sfConfig extends DefaultTraceCompound; > > > > This will print the lifecycle steps of all the components and you will > be able to see their termination record. > > > > > > The solution for your example looks like: > > > > #include "org/smartfrog/sfcore/workflow/components.sf"; > > #include "org/smartfrog/components.sf" > > > > event1 extends Parallel { > > name "apache"; > > > > actions extends LAZY { > > e1 extends EventSend { > > sendTo:a LAZY ATTRIB e2; > > event "apache"; > > } > > > > e2 extends OnEvent { > > apache extends LAZY DoNothing { > > time 2000; > > message "here--e2"; > > } > > } > > } > > } > > > > sfConfig extends event1; > > > > > > I have uploaded the draft documentation for workflow components in > sourceforge. You can get it from: > > > > http://www.hpl.hp.com/research/smartfrog/papers/sfWorkflow.pdf > > > > or > > > > http://cvs.sourceforge.net/viewcvs.py/smartfrog/core/smartfrog/docs/sf > Workflow.pdf > > > > > > (Note that it takes sometime for the web proxy to update changes) > > > > > >> -----Original Message----- > >> From: qx...@cc... [mailto:qx...@cc...] > >> Sent: 27 May 2004 00:55 > >> To: jul...@hp... > >> Cc: sma...@pr...; qx...@cc... > >> Subject: RE: [Smartfrog-developer] Question for EventSend and OnEvent >> comp > >> onents > >> > >> Hi Julio, > >> Thanks for you nice explaination. After I changed Sequence to >> Parallel, it > >> does work. But when I try to exchange message between two components, >> I > >> still failed to get the follow example work: > >> > >> #include "org/smartfrog/sfcore/workflow/components.sf"; > >> #include "org/smartfrog/components.sf" > >> > >> event1 extends Parallel { > >> name "apache"; > >> > >> actions extends LAZY { > >> e1 extends EventSend { > >> sendTo:a LAZY ATTRIB e2; > >> event (name); > >> } > >> > >> e2 extends OnEvent{ > >> apache extends LAZY { > >> comp extends DoNothing { > >> time 2000; > >> message "here--e2"; > >> } > >> } > >> } > >> } > >> } > >> > >> sfConfig extends event1; > >> > >> Only the follow message was caught in sfDaemon. > >> ______________________________________________________________ > >> HOST athena.cc.gatech.edu:rootProcess:e:e1 sending apache to > >> org.smartfrog.sfcore.workflow.components.OnEvent_Stub[RemoteStub >> [ref: > >> [endpoint:[130.207.5.222:36711](local),objID:[254]]]] > >> __________________________________________________________________ > >> > >> e2 doesn't get the apache event. > >> > >> How can I make it work? > >> > >> thanks > >> Qinyi > >> > >> > >> > >> > >> > > >> > Hi Qinyi, > >> > > >> > You are making a correct use of EvenSent. Your problem is that you >> are > >> > sending an event to a component that does not exist yet. e1 and >> comp1 > >> > are in a Sequence and therefore comp1 won't be deployed until e1 >> > has > >> > terminated. > >> > > >> > If you replace Sequence with Parallel your example will work. > >> > > >> > Parallel will deploy all its children and it will terminate when >> > all >> its > >> > children have terminated. > >> > > >> > There is another example in examples/workflow that you can use. > >> > > >> > We are planning make some changes in the workflow components and >> that is > >> > why you haven't seen any documentation for the workflow yet. > >> > > >> > Some info about those components: > >> > > >> > DoNothing > >> > > >> > DoNothing extends EventPrim { > >> > sfClass "com.hp.sfServices.workflow.Components.DoNothing"; > >> > time 10000000; // time in milliseconds to >> wait > >> > terminationType "normal"; // termination record type > >> > printEvents false; > >> > // message "a message to print on the console prefixed by full >> name" > >> > } > >> > > >> > The do-nothing construct does nothing for a time, then terminates >> > as > >> > required. Its purpose is primarily to act as a stub for bits of >> workflow > >> > yet to be written during testing. If terminationType is set to >> "none", > >> > it waits for ever. > >> > > >> > The component prints the message to stdout and starts the timer >> during > >> > its start phase and terminates when the timer has fired. If the >> > time >> is > >> > 0, the component will terminate immediately - though a thread is >> started > >> > to do this so some asynchrony occurs. If no message is provided, no > >> > message is printed. > >> > > >> > If the attribute printEvents is set to true, any events that it > >> > receives will be printed on the console. If printEvents is false, >> > it > >> > does nothing internal with events, merely forwarding them as >> required. > >> > > >> > EventSend > >> > > >> > > >> > EventSend extends EventPrim { > >> > sfClass "com.hp.sfServices.workflow.Components.EventSend"; > >> > // event "the string to send as an event"; > >> > } > >> > > >> > An event sender contains an event to send, and it forwards the >> > event >> to > >> > any registered components as defined in the event framework. > >> > > >> > The component sends its event during the start phase, and then > >> > terminates asynchronously. It does nothing internal with received > >> > events. > >> > EventCounter > >> > > >> > EventCounter extends EventPrim { > >> > sfClass "com.hp.sfServices.workflow.Components.EventCounter"; > >> > count 1; > >> > allDifferent "true"; > >> > } > >> > > >> > Event counter waist for events, when they arrive it decrements its > >> > counter (default 1). When the counter reaches 0, the component > >> > terminates. If the attribute allDifferent is set to true, the >> counter is > >> > not decremented if the event it receives is an identical string. > >> > OnEvent > >> > > >> > OnEvent extends EventCompound { > >> > sfClass "com.hp.sfServices.workflow.Components.OnEvent"; > >> > //event1 extends LAZY ... { ... } > >> > //event2 extends LAZY ... { ... } > >> > //otherwise extends LAZY ... { ... } > >> > } > >> > > >> > The OnEvent event dispatcher provides a number of named event >> handlers > >> > as attributes - defined as LAZY components. When an event arrives, >> it is > >> > compared to the names of the attributes using Java string equality, >> and > >> > if a matching attribute is found the component description is taken >> and > >> > deployed. If no match is found, the otherwise template is taken. If >> that > >> > is not present, the component terminates with an error. > >> > > >> > Once a handler has been started, it runs as the newly created > >> > sub-component as a child using the name running. When that child > >> > terminates, so does the OnEvent, with the same termination type. > >> > > >> > > >> > Regards, > >> > Julio Guijarro > >> >> -----Original Message----- > >> >> From: sma...@li... > >> >> [mailto:smartfrog- dev...@li...] On >> >> Behalf >> Of > >> >> qx...@cc... Sent: 26 May 2004 19:56 > >> >> To: sma...@li... > >> >> Subject: [Smartfrog-developer] Question for EventSend and OnEvent > >> >> components > >> >> > >> >> Hi, > >> >> I want to use the Events mechanism in SF to exchange message >> between > >> >> different components. Two insteresting components are EventSend >> >> and > >> >> OnEvent. But I cannot find an example of how to use them. The only > >> >> place I could get some hints for EventSend is in > >> >> genericInstallScript.sf in dynamicWebserver example. However, when >> I > >> >> wrote a component like: > >> >> ------------------------------------------------------------ > >> >> #include "org/smartfrog/sfcore/workflow/components.sf"; > >> >> #include "org/smartfrog/components.sf" > >> >> > >> >> > >> >> event1 extends Sequence { > >> >> name "test"; > >> >> > >> >> actions extends LAZY { > >> >> e1 extends EventSend { > >> >> sendTo:a LAZY ATTRIB comp1; > >> >> event (name); > >> >> } > >> >> comp1 extends DoNothing { > >> >> time 2000; > >> >> message "here"; > >> >> } > >> >> > >> >> } > >> >> } > >> >> > >> >> sfConfig extends event1; > >> >> ------------------------------------------------------------ > >> >> > >> >> It can be parsed successful. But when I used sfStart to deploy it, >> the > >> >> following error message was thrown: > >> >> > >> >> $ sfStart localhost e event.sf > >> >> SmartFrog 3.02.002_beta > >> >> (C) Copyright 1998-2004 Hewlett-Packard Development Company, LP > >> >> Warning: SmartFrog security is NOT active > >> >> - FAILED when trying DEPLOY of 'e', [event.sf], host:localhost > >> >> Error: > >> >> SmartFrogLifecycleException:: sfStart: > >> >> cause: SmartFrogResolutionException:: Reference not found, > >> >> Unresolved > >> >> Reference: LAZY comp1, source: HOST > >> >> athena.cc.gatech.edu:rootProcess:e, path(83) > >> >> Command line SFACT: 'e:DEPLOY:event.sf::localhost:' > >> >> To String: ' name:e, type:DEPLOY, url:event.sf, >> host:localhost, > >> >> resultType:FAILED, resultExceptionMessage:sfStart: ' > >> >> > >> >> Is there anyone who can show me an example how to use these two > >> >> components? > >> >> > >> >> Thanks > >> >> Qinyi > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> ------------------------------------------------------- > >> >> This SF.Net email is sponsored by: Oracle 10g > >> >> Get certified on the hottest thing ever to hit the market... >> >> Oracle > >> >> 10g. Take an Oracle 10g class now, and we'll give you the exam >> FREE. > >> >> http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > >> >> _______________________________________________ > >> >> Smartfrog-developer mailing list > >> >> Sma...@li... > >> >> https://lists.sourceforge.net/lists/listinfo/smartfrog-developer ------------------------------------------------------- This SF.Net email is sponsored by: Oracle 10g Get certified on the hottest thing ever to hit the market... Oracle 10g. Take an Oracle 10g class now, and we'll give you the exam FREE. http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click _______________________________________________ Smartfrog-developer mailing list Sma...@li... https://lists.sourceforge.net/lists/listinfo/smartfrog-developer |