From: Sahananda (J. W. <sah...@wi...> - 2011-04-02 14:04:26
|
I have a question, and I hope it is ok to ask it here. It has been brought up by my struggle to move my work to 4.0, but if solved for me could benefit many people. My specific problem is about managing to use rexx/sql with ooRexx 4.0 in a multithreaded environment, but it might b better if I ask the list a more general question. That is, where one has to provide one’s applications with a service that continuously runs, what is the best way to set it up, use it and tear it down. This question has become more important in 4.0, because there used to be a loophole in ooDialog that allowed one to run methods on the ‘main’ thread of a dialog. Now that has gone, it needs to be done properly. So for me, because rexx\sql needs to run on the thread that the library was loaded on, I have built a little server, I queue message objects on the server, and it performs them on the correct thread. That all works very well. My problem pertains to how to set it up when it is first needed, and tear it down when it is finished with. I can set it up and start it running, by doing so in the CLASS INIT method. This means that the first script that includes the server class in a ::REQUIRES directive loads the rexx\sql libraries and kicks off the server. Subsequent scripts may be loaded which ‘require’ the server class, and it is there and running. However, when all the client scripts have finished and terminated, the server is still sitting there all alone running, and my interpreter instance won’t terminate. Is there some mechanism by which the server can know that everything else has terminated and it is alone in the world? Ancillary to that question was a question I asked on the RexxLA list, which was, if you have a process which ‘runs on’ in this fashion, is there some way to detect which method is still ‘active’ (I use the word active advisedly, as it is probably in a guarded state). Many thanks, Jon |
From: Gil B. <gba...@al...> - 2011-04-02 15:04:12
|
Jon, Let me suggest an alternate way of approaching the problem. Instead of the server trying to determine if it should shut down, have it understand a message object that means "shut yourself down". Now you have moved the problem back to the main code which needs to have a "last" script - one that runs after all the other scripts that use the server have terminated - and that sends the "shut yourself down" message to the server before exiting. Sahananda (Jon) Wolfers wrote: > I have a question, and I hope it is ok to ask it here. > > It has been brought up by my struggle to move my work to 4.0, but if > solved for me could benefit many people. > > > > My specific problem is about managing to use rexx/sql with ooRexx 4.0 in > a multithreaded environment, but it might b better if I ask the list a > more general question. > > > > That is, where one has to provide one’s applications with a service that > continuously runs, what is the best way to set it up, use it and tear it > down. This question has become more important in 4.0, because there > used to be a loophole in ooDialog that allowed one to run methods on the > ‘main’ thread of a dialog. Now that has gone, it needs to be done properly. > > > > So for me, because rexx\sql needs to run on the thread that the library > was loaded on, I have built a little server, I queue message objects on > the server, and it performs them on the correct thread. That all works > very well. My problem pertains to how to set it up when it is first > needed, and tear it down when it is finished with. > > > > I can set it up and start it running, by doing so in the CLASS INIT > method. This means that the first script that includes the server class > in a ::REQUIRES directive loads the rexx\sql libraries and kicks off the > server. > > > > Subsequent scripts may be loaded which ‘require’ the server class, and > it is there and running. > > > > However, when all the client scripts have finished and terminated, the > server is still sitting there all alone running, and my interpreter > instance won’t terminate. > > > > Is there some mechanism by which the server can know that everything > else has terminated and it is alone in the world? > > > > Ancillary to that question was a question I asked on the RexxLA list, > which was, if you have a process which ‘runs on’ in this fashion, is > there some way to detect which method is still ‘active’ (I use the word > active advisedly, as it is probably in a guarded state). > > > > Many thanks, > > > > Jon > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > > ------------------------------------------------------------------------ > > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > https://lists.sourceforge.net/lists/listinfo/oorexx-devel -- Gil Barmwater |
From: Mark M. <mie...@gm...> - 2011-04-02 15:06:37
|
On Sat, Apr 2, 2011 at 7:03 AM, Sahananda (Jon) Wolfers < sah...@wi...> wrote: > I have a question, and I hope it is ok to ask it here. > > It has been brought up by my struggle to move my work to 4.0, but if solved > for me could benefit many people. > > > > My specific problem is about managing to use rexx/sql with ooRexx 4.0 in a > multithreaded environment, but it might b better if I ask the list a more > general question. > > > > That is, where one has to provide one’s applications with a service that > continuously runs, what is the best way to set it up, use it and tear it > down. This question has become more important in 4.0, because there used > to be a loophole in ooDialog that allowed one to run methods on the ‘main’ > thread of a dialog. Now that has gone, it needs to be done properly. > > > > So for me, because rexx\sql needs to run on the thread that the library was > loaded on, I have built a little server, I queue message objects on the > server, and it performs them on the correct thread. That all works very > well. My problem pertains to how to set it up when it is first needed, > and tear it down when it is finished with. > Well, as always questions like this are hard to answer without knowing what your code is doing. But, one approach comes directly from what you say above. If you are queueing messages to the server, just define a special message that means "shut down". Then when your application is terminating, send it that message. I doubt that there is any one "right" way to do this. Another approach is to have some variable that the server checks each time it enters its processing loop. If the variable is true, it drops out of the loop and the thread terminates. Then when the application is terminating you set the varible and manually force the server to check if it needs to process something. Again, I'd suggest looking at the sysinfo.rex example in trunk. It solves a problem that seems to be similar to yours, every use of OLE has to be done on the same thread. main\samples\windows\oodialog\sysinfo -- Mark Miesfeld |
From: Sahananda (J. W. <sah...@wi...> - 2011-04-02 15:29:08
|
Hi Mark & Gil, thank you both for your help, but I think what it points to is I have not explained myself. Both of those aproaches predicate a single client using the server. Let's say I have two routines called A & B that both use the server and have reqires directives in their scripts. a script called C calls A which calls B another script D calls B then calls A Whichever way around they are run, the first one 'require'ed will start up the server. If one of them shuts it down when it terminates, then it is not available to the other. My problem is not shutting it down, but rather knowing when it is apropriate to shut it down. I'm sorry that I'm still worrying away at this on the lists after a year Jon On 2 April 2011 16:06, Mark Miesfeld <mie...@gm...> wrote: > On Sat, Apr 2, 2011 at 7:03 AM, Sahananda (Jon) Wolfers < > sah...@wi...> wrote: > >> I have a question, and I hope it is ok to ask it here. >> >> It has been brought up by my struggle to move my work to 4.0, but if >> solved for me could benefit many people. >> >> >> >> My specific problem is about managing to use rexx/sql with ooRexx 4.0 in a >> multithreaded environment, but it might b better if I ask the list a more >> general question. >> >> >> >> That is, where one has to provide one’s applications with a service that >> continuously runs, what is the best way to set it up, use it and tear it >> down. This question has become more important in 4.0, because there used >> to be a loophole in ooDialog that allowed one to run methods on the ‘main’ >> thread of a dialog. Now that has gone, it needs to be done properly. >> >> >> >> So for me, because rexx\sql needs to run on the thread that the library >> was loaded on, I have built a little server, I queue message objects on the >> server, and it performs them on the correct thread. That all works very >> well. My problem pertains to how to set it up when it is first needed, >> and tear it down when it is finished with. >> > > Well, as always questions like this are hard to answer without knowing what > your code is doing. > > But, one approach comes directly from what you say above. If you are > queueing messages to the server, just define a special message that means > "shut down". Then when your application is terminating, send it that > message. > > I doubt that there is any one "right" way to do this. > > Another approach is to have some variable that the server checks each time > it enters its processing loop. If the variable is true, it drops out of the > loop and the thread terminates. Then when the application is terminating > you set the varible and manually force the server to check if it needs to > process something. > > Again, I'd suggest looking at the sysinfo.rex example in trunk. It solves > a problem that seems to be similar to yours, every use of OLE has to be done > on the same thread. > > main\samples\windows\oodialog\sysinfo > > -- > Mark Miesfeld > > > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > https://lists.sourceforge.net/lists/listinfo/oorexx-devel > > |
From: Mark M. <mie...@gm...> - 2011-04-02 15:44:14
|
On Sat, Apr 2, 2011 at 8:28 AM, Sahananda (Jon) Wolfers < sah...@wi...> wrote: > > Both of those aproaches predicate a single client using the server. Let's > say I have two routines called A & B that both use the server and have > reqires directives in their scripts. > > a script called C calls A which calls B > another script D calls B then calls A > Are both script 'a script' and script 'another script' run from the command line? What 'runs' these scripts? A person from the command line, or some software application? > > My problem is not shutting it down, but rather knowing when it is > apropriate to shut it down. > Whatever is using the database server has to know when it is appropraite to shut it down. If it is a person, create a program that starts the server and a program that stops the server. Then instruct the person to run the start up program first thing and to run the shut down program last thing. If it is some software application, then start the server on application start up, and shut the server down when the application ends. -- Mark Miesfeld |
From: Bill T. W. <wb...@ar...> - 2011-04-02 18:30:40
|
Jon, Can you also implement a global "usage count"? When the count is zero, the service can shutdown. That way both A and B increment the count by one when they start, and reduce it by one when they terminate when they quit. if somebody else starts then count goes up one more. Eventually everybody will quit and the count becomes zero. when it is zero the server shuts its self down. Using your example, the count could get to four a script called C calls A (count +1) which calls B (count +1) [count is now 2] another script D calls B (count +1) then calls A (count +1) [count is now 4] As CAB processes and each called routine terminates, the count becomes three and two... As DBA processes and each called routine terminates, the count becomes one and zero... This also allows for intertwining... and when the count is zero, the server could either decide to terminate or go into a "sleep" before terminating. Maybe a count of "-1" means that we are getting ready to shutdown, so that other routines know to wait before trying to start the server back up... /s/ Bill Turner, wb4alm On 04/02/2011 11:28 AM, Sahananda (Jon) Wolfers wrote: > Hi Mark & Gil, > > thank you both for your help, but I think what it points to is I have > not explained myself. > > Both of those aproaches predicate a single client using the server. > Let's say I have two routines called A & B that both use the server > and have reqires directives in their scripts. > > a script called C calls A which calls B > another script D calls B then calls A > > Whichever way around they are run, the first one 'require'ed will > start up the server. > If one of them shuts it down when it terminates, then it is not > available to the other. > > My problem is not shutting it down, but rather knowing when it is > apropriate to shut it down. > > I'm sorry that I'm still worrying away at this on the lists after a year > > Jon > > On 2 April 2011 16:06, Mark Miesfeld <mie...@gm... > <mailto:mie...@gm...>> wrote: > > On Sat, Apr 2, 2011 at 7:03 AM, Sahananda (Jon) Wolfers > <sah...@wi... <mailto:sah...@wi...>> wrote: > > I have a question, and I hope it is ok to ask it here. > > It has been brought up by my struggle to move my work to 4.0, > but if solved for me could benefit many people. > > My specific problem is about managing to use rexx/sql with > ooRexx 4.0 in a multithreaded environment, but it might b > better if I ask the list a more general question. > > That is, where one has to provide one’s applications with a > service that continuously runs, what is the best way to set it > up, use it and tear it down.This question has become more > important in 4.0, because there used to be a loophole in > ooDialog that allowed one to run methods on the ‘main’ thread > of a dialog.Now that has gone, it needs to be done properly. > > So for me, because rexx\sql needs to run on the thread that > the library was loaded on, I have built a little server, I > queue message objects on the server, and it performs them on > the correct thread.That all works very well.My problem > pertains to how to set it up when it is first needed, and tear > it down when it is finished with. > > Well, as always questions like this are hard to answer without > knowing what your code is doing. > But, one approach comes directly from what you say above. If you > are queueing messages to the server, just define a special message > that means "shut down". Then when your application is > terminating, send it that message. > I doubt that there is any one "right" way to do this. > Another approach is to have some variable that the server checks > each time it enters its processing loop. If the variable is true, > it drops out of the loop and the thread terminates. Then when the > application is terminating you set the varible and manually force > the server to check if it needs to process something. > Again, I'd suggest looking at the sysinfo.rex example in trunk. > It solves a problem that seems to be similar to yours, every use > of OLE has to be done on the same thread. > main\samples\windows\oodialog\sysinfo > -- > Mark Miesfeld > > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > <mailto:Oor...@li...> > https://lists.sourceforge.net/lists/listinfo/oorexx-devel > > > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > https://lists.sourceforge.net/lists/listinfo/oorexx-devel |
From: Sahananda (J. W. <sah...@wi...> - 2011-04-02 18:55:38
|
Hi Bill, this is the conclusion I had come to when I read Mark last. I won't start the server in the init class method, but anything that uses it will have to start it and then stop it when they have finished. Starting when already started will just add to the usage count. Stopping decreases it and when it is 0 it really stops. It will mean changing my existing code a bit (which I had hoped to avoid), but it seems the sensible way to go. thanks, Jon PS: thanks Rony - that gave me something to think about. On 2 April 2011 19:13, Bill Turner, WB4ALM <wb...@ar...> wrote: > Jon, Can you also implement a global "usage count"? When the count is > zero, the service can shutdown. > > That way both A and B increment the count by one when they start, and > reduce it by one when they terminate when they quit. > > if somebody else starts then count goes up one more. Eventually everybody > will quit and the count becomes zero. > when it is zero the server shuts its self down. > > Using your example, the count could get to four > > a script called C calls A (count +1) which calls B (count +1) [count is > now 2] > another script D calls B (count +1) then calls A (count +1) [count is now > 4] > > As CAB processes and each called routine terminates, the count becomes > three and two... > As DBA processes and each called routine terminates, the count becomes one > and zero... > > This also allows for intertwining... and when the count is zero, the > server could either decide to terminate > or go into a "sleep" before terminating. Maybe a count of "-1" means that > we are getting ready to shutdown, > so that other routines know to wait before trying to start the server back > up... > > /s/ Bill Turner, wb4alm > > > > > > On 04/02/2011 11:28 AM, Sahananda (Jon) Wolfers wrote: > > Hi Mark & Gil, > > thank you both for your help, but I think what it points to is I have not > explained myself. > > Both of those aproaches predicate a single client using the server. Let's > say I have two routines called A & B that both use the server and have > reqires directives in their scripts. > > a script called C calls A which calls B > another script D calls B then calls A > > Whichever way around they are run, the first one 'require'ed will start up > the server. > If one of them shuts it down when it terminates, then it is not available > to the other. > > My problem is not shutting it down, but rather knowing when it is > apropriate to shut it down. > > I'm sorry that I'm still worrying away at this on the lists after a year > > Jon > > On 2 April 2011 16:06, Mark Miesfeld <mie...@gm...> wrote: > >> On Sat, Apr 2, 2011 at 7:03 AM, Sahananda (Jon) Wolfers < >> sah...@wi...> wrote: >> >>> I have a question, and I hope it is ok to ask it here. >>> >>> It has been brought up by my struggle to move my work to 4.0, but if >>> solved for me could benefit many people. >>> >>> >>> >>> My specific problem is about managing to use rexx/sql with ooRexx 4.0 in >>> a multithreaded environment, but it might b better if I ask the list a more >>> general question. >>> >>> >>> >>> That is, where one has to provide one’s applications with a service that >>> continuously runs, what is the best way to set it up, use it and tear it >>> down. This question has become more important in 4.0, because there >>> used to be a loophole in ooDialog that allowed one to run methods on the >>> ‘main’ thread of a dialog. Now that has gone, it needs to be done >>> properly. >>> >>> >>> >>> So for me, because rexx\sql needs to run on the thread that the library >>> was loaded on, I have built a little server, I queue message objects on the >>> server, and it performs them on the correct thread. That all works very >>> well. My problem pertains to how to set it up when it is first needed, >>> and tear it down when it is finished with. >>> >> >> Well, as always questions like this are hard to answer without knowing >> what your code is doing. >> >> But, one approach comes directly from what you say above. If you are >> queueing messages to the server, just define a special message that means >> "shut down". Then when your application is terminating, send it that >> message. >> >> I doubt that there is any one "right" way to do this. >> >> Another approach is to have some variable that the server checks each time >> it enters its processing loop. If the variable is true, it drops out of the >> loop and the thread terminates. Then when the application is terminating >> you set the varible and manually force the server to check if it needs to >> process something. >> >> Again, I'd suggest looking at the sysinfo.rex example in trunk. It solves >> a problem that seems to be similar to yours, every use of OLE has to be done >> on the same thread. >> >> main\samples\windows\oodialog\sysinfo >> >> -- >> Mark Miesfeld >> >> >> >> ------------------------------------------------------------------------------ >> Create and publish websites with WebMatrix >> Use the most popular FREE web apps or write code yourself; >> WebMatrix provides all the features you need to develop and >> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >> _______________________________________________ >> Oorexx-devel mailing list >> Oor...@li... >> https://lists.sourceforge.net/lists/listinfo/oorexx-devel >> >> > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > > _______________________________________________ > Oorexx-devel mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/oorexx-devel > > > > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > https://lists.sourceforge.net/lists/listinfo/oorexx-devel > > |
From: Sahananda (J. W. <sah...@wi...> - 2011-04-22 09:16:38
|
I just wanted to report back that I have solved this now and thank everyone for their help. What I kept running into, which floored me was that with rexx\sql you have to run the loadfuncs function, when you start on a new thread, even though rxFuncQuery reports the functions as already loaded. Once I got that into my head, I could load/unload the functions on each invocation of the server and the server could shut itself down (after a suitable quiescent interval - thanks for that hint Rony - saves a great deal of thrashing) Jon On 2 April 2011 19:55, Sahananda (Jon) Wolfers <sah...@wi...>wrote: > Hi Bill, > > this is the conclusion I had come to when I read Mark last. I won't start > the server in the init class method, but anything that uses it will have to > start it and then stop it when they have finished. Starting when already > started will just add to the usage count. Stopping decreases it and when it > is 0 it really stops. It will mean changing my existing code a bit (which I > had hoped to avoid), but it seems the sensible way to go. > > thanks, > > Jon > > PS: thanks Rony - that gave me something to think about. > > > > > On 2 April 2011 19:13, Bill Turner, WB4ALM <wb...@ar...> wrote: > >> Jon, Can you also implement a global "usage count"? When the count is >> zero, the service can shutdown. >> >> That way both A and B increment the count by one when they start, and >> reduce it by one when they terminate when they quit. >> >> if somebody else starts then count goes up one more. Eventually everybody >> will quit and the count becomes zero. >> when it is zero the server shuts its self down. >> >> Using your example, the count could get to four >> >> a script called C calls A (count +1) which calls B (count +1) [count is >> now 2] >> another script D calls B (count +1) then calls A (count +1) [count is >> now 4] >> >> As CAB processes and each called routine terminates, the count becomes >> three and two... >> As DBA processes and each called routine terminates, the count becomes one >> and zero... >> >> This also allows for intertwining... and when the count is zero, the >> server could either decide to terminate >> or go into a "sleep" before terminating. Maybe a count of "-1" means that >> we are getting ready to shutdown, >> so that other routines know to wait before trying to start the server back >> up... >> >> /s/ Bill Turner, wb4alm >> >> >> >> >> >> On 04/02/2011 11:28 AM, Sahananda (Jon) Wolfers wrote: >> >> Hi Mark & Gil, >> >> thank you both for your help, but I think what it points to is I have not >> explained myself. >> >> Both of those aproaches predicate a single client using the server. Let's >> say I have two routines called A & B that both use the server and have >> reqires directives in their scripts. >> >> a script called C calls A which calls B >> another script D calls B then calls A >> >> Whichever way around they are run, the first one 'require'ed will start up >> the server. >> If one of them shuts it down when it terminates, then it is not available >> to the other. >> >> My problem is not shutting it down, but rather knowing when it is >> apropriate to shut it down. >> >> I'm sorry that I'm still worrying away at this on the lists after a year >> >> Jon >> >> On 2 April 2011 16:06, Mark Miesfeld <mie...@gm...> wrote: >> >>> On Sat, Apr 2, 2011 at 7:03 AM, Sahananda (Jon) Wolfers < >>> sah...@wi...> wrote: >>> >>>> I have a question, and I hope it is ok to ask it here. >>>> >>>> It has been brought up by my struggle to move my work to 4.0, but if >>>> solved for me could benefit many people. >>>> >>>> >>>> >>>> My specific problem is about managing to use rexx/sql with ooRexx 4.0 in >>>> a multithreaded environment, but it might b better if I ask the list a more >>>> general question. >>>> >>>> >>>> >>>> That is, where one has to provide one’s applications with a service that >>>> continuously runs, what is the best way to set it up, use it and tear it >>>> down. This question has become more important in 4.0, because there >>>> used to be a loophole in ooDialog that allowed one to run methods on the >>>> ‘main’ thread of a dialog. Now that has gone, it needs to be done >>>> properly. >>>> >>>> >>>> >>>> So for me, because rexx\sql needs to run on the thread that the library >>>> was loaded on, I have built a little server, I queue message objects on the >>>> server, and it performs them on the correct thread. That all works >>>> very well. My problem pertains to how to set it up when it is first >>>> needed, and tear it down when it is finished with. >>>> >>> >>> Well, as always questions like this are hard to answer without knowing >>> what your code is doing. >>> >>> But, one approach comes directly from what you say above. If you are >>> queueing messages to the server, just define a special message that means >>> "shut down". Then when your application is terminating, send it that >>> message. >>> >>> I doubt that there is any one "right" way to do this. >>> >>> Another approach is to have some variable that the server checks each >>> time it enters its processing loop. If the variable is true, it drops out >>> of the loop and the thread terminates. Then when the application is >>> terminating you set the varible and manually force the server to check if it >>> needs to process something. >>> >>> Again, I'd suggest looking at the sysinfo.rex example in trunk. It >>> solves a problem that seems to be similar to yours, every use of OLE has to >>> be done on the same thread. >>> >>> main\samples\windows\oodialog\sysinfo >>> >>> -- >>> Mark Miesfeld >>> >>> >>> >>> ------------------------------------------------------------------------------ >>> Create and publish websites with WebMatrix >>> Use the most popular FREE web apps or write code yourself; >>> WebMatrix provides all the features you need to develop and >>> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >>> >>> _______________________________________________ >>> Oorexx-devel mailing list >>> Oor...@li... >>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel >>> >>> >> >> ------------------------------------------------------------------------------ >> Create and publish websites with WebMatrix >> Use the most popular FREE web apps or write code yourself; >> WebMatrix provides all the features you need to develop and >> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >> >> _______________________________________________ >> Oorexx-devel mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/oorexx-devel >> >> >> >> >> ------------------------------------------------------------------------------ >> Create and publish websites with WebMatrix >> Use the most popular FREE web apps or write code yourself; >> WebMatrix provides all the features you need to develop and >> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >> _______________________________________________ >> Oorexx-devel mailing list >> Oor...@li... >> https://lists.sourceforge.net/lists/listinfo/oorexx-devel >> >> > |
From: Rony G. F. <Ron...@wu...> - 2011-04-02 15:28:24
|
Jon: Another technique could be to define a timeout in the server, after which the server shuts down (drops its connection to the database). Something like: * each request sent to the server will cause the server code to: 1. check whether a prior alarm object (see step #4 below) was created, if so, cancel the alarm, 2. fetch the received request, 3. carry out the request, 4. create a new alarm object which will send the shutdown request to the server (e.g. after one/five/ten/60/...whatever-you-think-appropriate minutes), unless the currently handled request is the shutdown request. Once the server has stopped, it may still be the case that it should re-establish its services, if you keep on accepting requests. If so you would create a server object, but not establish a connection to the RDBMS. Then, when the server object receives a request, it will check whether a connection to the database is active, and if so uses it, otherwise it establishes a new connection to carry out the request, and afterwards will keep the connection open for the given timeout period. HTH, ---rony On 02.04.2011 16:03, Sahananda (Jon) Wolfers wrote: > > I have a question, and I hope it is ok to ask it here. > > It has been brought up by my struggle to move my work to 4.0, but if > solved for me could benefit many people. > > > > My specific problem is about managing to use rexx/sql with ooRexx 4.0 > in a multithreaded environment, but it might b better if I ask the > list a more general question. > > > > That is, where one has to provide one’s applications with a service > that continuously runs, what is the best way to set it up, use it and > tear it down. This question has become more important in 4.0, because > there used to be a loophole in ooDialog that allowed one to run > methods on the ‘main’ thread of a dialog. Now that has gone, it needs > to be done properly. > > > > So for me, because rexx\sql needs to run on the thread that the > library was loaded on, I have built a little server, I queue message > objects on the server, and it performs them on the correct thread. > That all works very well. My problem pertains to how to set it up > when it is first needed, and tear it down when it is finished with. > > > > I can set it up and start it running, by doing so in the CLASS INIT > method. This means that the first script that includes the server > class in a ::REQUIRES directive loads the rexx\sql libraries and kicks > off the server. > > > > Subsequent scripts may be loaded which ‘require’ the server class, and > it is there and running. > > > > However, when all the client scripts have finished and terminated, the > server is still sitting there all alone running, and my interpreter > instance won’t terminate. > > > > Is there some mechanism by which the server can know that everything > else has terminated and it is alone in the world? > > > > Ancillary to that question was a question I asked on the RexxLA list, > which was, if you have a process which ‘runs on’ in this fashion, is > there some way to detect which method is still ‘active’ (I use the > word active advisedly, as it is probably in a guarded state). > > > |
From: Rony G. F. <Ron...@wu...> - 2011-04-22 10:35:11
|
Jon: On 22.04.2011 11:16, Sahananda (Jon) Wolfers wrote: > What I kept running into, which floored me was that with rexx\sql you > have to run the loadfuncs function, when you start on a new thread, > even though rxFuncQuery reports the functions as already loaded. AFAIR you should *never* unload external Rexx functions, as they do not consume real resources but allow Rexx to keep ("globally") an inventory of which external functions are located in which library. This way resolving external function calls is possible for Rexx. If you unload external Rexx functions, then the unloading occurs "globally", i.e. if you have Rexx programs running in parallel in other processes (or threads for that matter), which rely on the presence of these external Rexx functions, they will stop to work as Rexx is not aware anymore that these external Rexx functions exist (and in which library), but will raise an appropriate error. HTH, ---rony |
From: Sahananda (J. W. <sah...@wi...> - 2011-04-22 11:21:22
|
Hi Rony, Thanks for that - it seems there are three operations here. there is 'registering' the function (handled via rxFuncLoad, rxFuncDrop) and there is 'loading' and 'initialising', in this case both handled by the libraries own functions 'SQLLoadFuncs' and 'SQLDropFuncs'. The documentation<http://rexxsql.sourceforge.net/doc/rexxsql/SQLDROPFUNCS.html>for rexxSQL says of SQLDropFuncs > It should be called at the end of every Rexx/SQL program. In particular, > this function should be called after a syntax error has been caught with > SIGNAL ON SYNTAX. > Mark Hessling says in response to a bug report<http://sourceforge.net/tracker/?func=detail&aid=3056981&group_id=30840&atid=400536>from Brian Cherry > SQLLoadFuncs() does some necessary initialisation, so SQLLoadFuncs() MUST > be called for each Rex/SQL program. Internally, SQLLoadFuncs() checks if > the other functions have been loaded, and loads then if not. > The documentation will be changed to reflect this requirement. > Trying to make sense of this in the context of your comment, I surmise that the SQLLoadFuncs and SQLdropFuncs functions don't necesarily load and drop the functions, but sometimes only perform some initialisation/uninitialisation tasks. Looking at the code, I guess that this is managed by the internal C variable RexxSQLInitialised thanks Jon On 22 April 2011 11:34, Rony G. Flatscher <Ron...@wu...>wrote: > Jon: > > On 22.04.2011 11:16, Sahananda (Jon) Wolfers wrote: > > What I kept running into, which floored me was that with rexx\sql you > > have to run the loadfuncs function, when you start on a new thread, > > even though rxFuncQuery reports the functions as already loaded. > AFAIR you should *never* unload external Rexx functions, as they do not > consume real resources but allow Rexx to keep ("globally") an inventory > of which external functions are located in which library. This way > resolving external function calls is possible for Rexx. > > If you unload external Rexx functions, then the unloading occurs > "globally", i.e. if you have Rexx programs running in parallel in other > processes (or threads for that matter), which rely on the presence of > these external Rexx functions, they will stop to work as Rexx is not > aware anymore that these external Rexx functions exist (and in which > library), but will raise an appropriate error. > > HTH, > > ---rony > > > ------------------------------------------------------------------------------ > Fulfilling the Lean Software Promise > Lean software platforms are now widely adopted and the benefits have been > demonstrated beyond question. Learn why your peers are replacing JEE > containers with lightweight application servers - and what you can gain > from the move. http://p.sf.net/sfu/vmware-sfemails > _______________________________________________ > Oorexx-devel mailing list > Oor...@li... > https://lists.sourceforge.net/lists/listinfo/oorexx-devel > |