Struts2 application scope instances









up vote
1
down vote

favorite












I've inherited a Struts2 project which needs some functionality addition. When I ran into de code to guess how the previous guy did things, I found out that if he wants a class to instantiate only once when the Tomcat server starts (because it has to read heavy loads of data from disk, but only once to get its config, for instance), he did this in the following way:



public class ExampleClass 
public ExampleClass()//Read files and stuff to initialize
public Object method(Object args)//The job to do



And then, in the struts action which uses it he instantiates it this way:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass()
public String execute()
//Do stuff every time the action is called
Object result = example.method(args);
// Do stuff with results




I know from servlet times that this does the trick, however, I feel like the guy who handled this before was as inexperienced in Struts2 as I am, so here comes my question:



Is this the proper way to do so according to style recommendations and best practices? Does struts2 provide a more controlled way to do so?



I found some answers related to simple parameters here, but I'm not sure if this is the proper way for objects like those? What would happen if ExampleClass instance is really heavy? I don't want them to be copied around:



How to set a value in application scope in struts2?



Some background about ExampleClass: When the constructor is called, it reads large sets of files and extracts it's configurations from them, creating complex internal representations.
When method() is called, it analyzes it's parameters using the rules, and outputs results to the user. This process usually takes seconds, and doesn't modify the previously initialized rule values.



This is running in Tomcat 7, however, I'm planning to upgrade to Tomcat 8.5 when everything is in place. I'd like to know if there are known issues about this regarding to this setup aswell (there are no other incompatibilities in the code).



BTW: He's not checking if ExampleClass is broken or anything like that, this definetly looks like a recipe to disaster xD. In fact, If I remove the source files, it is still trying to execute the method()... Poor soul...



Ideally, I need a way to instantiate all my application-level objects on start-up (they're the application itself, the rest is just a mere interface) in a way that if they fail Struts2 will tell Tomcat not to start that war, with the corresponding error logging and so on.



If Struts2 doesn't support this, which is the commonly accepted work-around? Maybe some Interceptor to check the object status and return to a error page if it hasn't been correctly instantiated? Execute a partial stop of tomcat from within?



All the objects of this project are thread safe (the only write operation inside them is performed on initialization), but I'd like to know best practices for Struts2 when objects are not so simple. What happens if a user can actually break one? (I know I should by any means avoid that, and I do, but mistakes happen, so I need a secure way to get through them, and get properly alerted, and of course I need a way to reinstantiate it safelly or to stop the whole service).



Right now, I can manually execute something like:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass();
private boolean otherIsBuildingExample = false;
public String execute() example.isBroken())
otherIsBuildingExample = true;
example = new ExampleClass();
otherIsBuildingExample = false;

Object result = example.method(args);
// Do stuff with results




Indeed, this would be cleaner with Interceptors, or so, however, this sounds like a pain in the *** for concurrency, specially taking into consideration thay example takes several seconds to start, and that more requests can come, so more concerns to take into consideration, like: what if two people call if(otherIsBuildingExample) and the second one gets the value before the first one performs otherIsBuildingExample=true? Nothing good... If the class is simple enough, both will instantiate and the slower one will prevail, but if one instantiation blocks the other's resources... well, more problems.



The only clean solution I can think of is to make ExampleClass robust enough so you can repare it using its own methods (not reinstantiating) and make those thread safe in the common way (if 10 people try to repair it, only one will proceed, while the others are just waiting for the first to end to continue, for instance).



Or maybe everytime you call execute() you get a copy of example, so no worries at all about this?



I'm digging into struts documentation
Thanks in advance.










share|improve this question























  • There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
    – Dave Newton
    Nov 13 at 15:37










  • yeah, thats what I thought, thanks @DaveNewton.
    – DGoiko
    Nov 13 at 23:31














up vote
1
down vote

favorite












I've inherited a Struts2 project which needs some functionality addition. When I ran into de code to guess how the previous guy did things, I found out that if he wants a class to instantiate only once when the Tomcat server starts (because it has to read heavy loads of data from disk, but only once to get its config, for instance), he did this in the following way:



public class ExampleClass 
public ExampleClass()//Read files and stuff to initialize
public Object method(Object args)//The job to do



And then, in the struts action which uses it he instantiates it this way:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass()
public String execute()
//Do stuff every time the action is called
Object result = example.method(args);
// Do stuff with results




I know from servlet times that this does the trick, however, I feel like the guy who handled this before was as inexperienced in Struts2 as I am, so here comes my question:



Is this the proper way to do so according to style recommendations and best practices? Does struts2 provide a more controlled way to do so?



I found some answers related to simple parameters here, but I'm not sure if this is the proper way for objects like those? What would happen if ExampleClass instance is really heavy? I don't want them to be copied around:



How to set a value in application scope in struts2?



Some background about ExampleClass: When the constructor is called, it reads large sets of files and extracts it's configurations from them, creating complex internal representations.
When method() is called, it analyzes it's parameters using the rules, and outputs results to the user. This process usually takes seconds, and doesn't modify the previously initialized rule values.



This is running in Tomcat 7, however, I'm planning to upgrade to Tomcat 8.5 when everything is in place. I'd like to know if there are known issues about this regarding to this setup aswell (there are no other incompatibilities in the code).



BTW: He's not checking if ExampleClass is broken or anything like that, this definetly looks like a recipe to disaster xD. In fact, If I remove the source files, it is still trying to execute the method()... Poor soul...



Ideally, I need a way to instantiate all my application-level objects on start-up (they're the application itself, the rest is just a mere interface) in a way that if they fail Struts2 will tell Tomcat not to start that war, with the corresponding error logging and so on.



If Struts2 doesn't support this, which is the commonly accepted work-around? Maybe some Interceptor to check the object status and return to a error page if it hasn't been correctly instantiated? Execute a partial stop of tomcat from within?



All the objects of this project are thread safe (the only write operation inside them is performed on initialization), but I'd like to know best practices for Struts2 when objects are not so simple. What happens if a user can actually break one? (I know I should by any means avoid that, and I do, but mistakes happen, so I need a secure way to get through them, and get properly alerted, and of course I need a way to reinstantiate it safelly or to stop the whole service).



Right now, I can manually execute something like:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass();
private boolean otherIsBuildingExample = false;
public String execute() example.isBroken())
otherIsBuildingExample = true;
example = new ExampleClass();
otherIsBuildingExample = false;

Object result = example.method(args);
// Do stuff with results




Indeed, this would be cleaner with Interceptors, or so, however, this sounds like a pain in the *** for concurrency, specially taking into consideration thay example takes several seconds to start, and that more requests can come, so more concerns to take into consideration, like: what if two people call if(otherIsBuildingExample) and the second one gets the value before the first one performs otherIsBuildingExample=true? Nothing good... If the class is simple enough, both will instantiate and the slower one will prevail, but if one instantiation blocks the other's resources... well, more problems.



The only clean solution I can think of is to make ExampleClass robust enough so you can repare it using its own methods (not reinstantiating) and make those thread safe in the common way (if 10 people try to repair it, only one will proceed, while the others are just waiting for the first to end to continue, for instance).



Or maybe everytime you call execute() you get a copy of example, so no worries at all about this?



I'm digging into struts documentation
Thanks in advance.










share|improve this question























  • There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
    – Dave Newton
    Nov 13 at 15:37










  • yeah, thats what I thought, thanks @DaveNewton.
    – DGoiko
    Nov 13 at 23:31












up vote
1
down vote

favorite









up vote
1
down vote

favorite











I've inherited a Struts2 project which needs some functionality addition. When I ran into de code to guess how the previous guy did things, I found out that if he wants a class to instantiate only once when the Tomcat server starts (because it has to read heavy loads of data from disk, but only once to get its config, for instance), he did this in the following way:



public class ExampleClass 
public ExampleClass()//Read files and stuff to initialize
public Object method(Object args)//The job to do



And then, in the struts action which uses it he instantiates it this way:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass()
public String execute()
//Do stuff every time the action is called
Object result = example.method(args);
// Do stuff with results




I know from servlet times that this does the trick, however, I feel like the guy who handled this before was as inexperienced in Struts2 as I am, so here comes my question:



Is this the proper way to do so according to style recommendations and best practices? Does struts2 provide a more controlled way to do so?



I found some answers related to simple parameters here, but I'm not sure if this is the proper way for objects like those? What would happen if ExampleClass instance is really heavy? I don't want them to be copied around:



How to set a value in application scope in struts2?



Some background about ExampleClass: When the constructor is called, it reads large sets of files and extracts it's configurations from them, creating complex internal representations.
When method() is called, it analyzes it's parameters using the rules, and outputs results to the user. This process usually takes seconds, and doesn't modify the previously initialized rule values.



This is running in Tomcat 7, however, I'm planning to upgrade to Tomcat 8.5 when everything is in place. I'd like to know if there are known issues about this regarding to this setup aswell (there are no other incompatibilities in the code).



BTW: He's not checking if ExampleClass is broken or anything like that, this definetly looks like a recipe to disaster xD. In fact, If I remove the source files, it is still trying to execute the method()... Poor soul...



Ideally, I need a way to instantiate all my application-level objects on start-up (they're the application itself, the rest is just a mere interface) in a way that if they fail Struts2 will tell Tomcat not to start that war, with the corresponding error logging and so on.



If Struts2 doesn't support this, which is the commonly accepted work-around? Maybe some Interceptor to check the object status and return to a error page if it hasn't been correctly instantiated? Execute a partial stop of tomcat from within?



All the objects of this project are thread safe (the only write operation inside them is performed on initialization), but I'd like to know best practices for Struts2 when objects are not so simple. What happens if a user can actually break one? (I know I should by any means avoid that, and I do, but mistakes happen, so I need a secure way to get through them, and get properly alerted, and of course I need a way to reinstantiate it safelly or to stop the whole service).



Right now, I can manually execute something like:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass();
private boolean otherIsBuildingExample = false;
public String execute() example.isBroken())
otherIsBuildingExample = true;
example = new ExampleClass();
otherIsBuildingExample = false;

Object result = example.method(args);
// Do stuff with results




Indeed, this would be cleaner with Interceptors, or so, however, this sounds like a pain in the *** for concurrency, specially taking into consideration thay example takes several seconds to start, and that more requests can come, so more concerns to take into consideration, like: what if two people call if(otherIsBuildingExample) and the second one gets the value before the first one performs otherIsBuildingExample=true? Nothing good... If the class is simple enough, both will instantiate and the slower one will prevail, but if one instantiation blocks the other's resources... well, more problems.



The only clean solution I can think of is to make ExampleClass robust enough so you can repare it using its own methods (not reinstantiating) and make those thread safe in the common way (if 10 people try to repair it, only one will proceed, while the others are just waiting for the first to end to continue, for instance).



Or maybe everytime you call execute() you get a copy of example, so no worries at all about this?



I'm digging into struts documentation
Thanks in advance.










share|improve this question















I've inherited a Struts2 project which needs some functionality addition. When I ran into de code to guess how the previous guy did things, I found out that if he wants a class to instantiate only once when the Tomcat server starts (because it has to read heavy loads of data from disk, but only once to get its config, for instance), he did this in the following way:



public class ExampleClass 
public ExampleClass()//Read files and stuff to initialize
public Object method(Object args)//The job to do



And then, in the struts action which uses it he instantiates it this way:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass()
public String execute()
//Do stuff every time the action is called
Object result = example.method(args);
// Do stuff with results




I know from servlet times that this does the trick, however, I feel like the guy who handled this before was as inexperienced in Struts2 as I am, so here comes my question:



Is this the proper way to do so according to style recommendations and best practices? Does struts2 provide a more controlled way to do so?



I found some answers related to simple parameters here, but I'm not sure if this is the proper way for objects like those? What would happen if ExampleClass instance is really heavy? I don't want them to be copied around:



How to set a value in application scope in struts2?



Some background about ExampleClass: When the constructor is called, it reads large sets of files and extracts it's configurations from them, creating complex internal representations.
When method() is called, it analyzes it's parameters using the rules, and outputs results to the user. This process usually takes seconds, and doesn't modify the previously initialized rule values.



This is running in Tomcat 7, however, I'm planning to upgrade to Tomcat 8.5 when everything is in place. I'd like to know if there are known issues about this regarding to this setup aswell (there are no other incompatibilities in the code).



BTW: He's not checking if ExampleClass is broken or anything like that, this definetly looks like a recipe to disaster xD. In fact, If I remove the source files, it is still trying to execute the method()... Poor soul...



Ideally, I need a way to instantiate all my application-level objects on start-up (they're the application itself, the rest is just a mere interface) in a way that if they fail Struts2 will tell Tomcat not to start that war, with the corresponding error logging and so on.



If Struts2 doesn't support this, which is the commonly accepted work-around? Maybe some Interceptor to check the object status and return to a error page if it hasn't been correctly instantiated? Execute a partial stop of tomcat from within?



All the objects of this project are thread safe (the only write operation inside them is performed on initialization), but I'd like to know best practices for Struts2 when objects are not so simple. What happens if a user can actually break one? (I know I should by any means avoid that, and I do, but mistakes happen, so I need a secure way to get through them, and get properly alerted, and of course I need a way to reinstantiate it safelly or to stop the whole service).



Right now, I can manually execute something like:



public class SomeAction extends ActionSupport 
ExampleClass example = new ExampleClass();
private boolean otherIsBuildingExample = false;
public String execute() example.isBroken())
otherIsBuildingExample = true;
example = new ExampleClass();
otherIsBuildingExample = false;

Object result = example.method(args);
// Do stuff with results




Indeed, this would be cleaner with Interceptors, or so, however, this sounds like a pain in the *** for concurrency, specially taking into consideration thay example takes several seconds to start, and that more requests can come, so more concerns to take into consideration, like: what if two people call if(otherIsBuildingExample) and the second one gets the value before the first one performs otherIsBuildingExample=true? Nothing good... If the class is simple enough, both will instantiate and the slower one will prevail, but if one instantiation blocks the other's resources... well, more problems.



The only clean solution I can think of is to make ExampleClass robust enough so you can repare it using its own methods (not reinstantiating) and make those thread safe in the common way (if 10 people try to repair it, only one will proceed, while the others are just waiting for the first to end to continue, for instance).



Or maybe everytime you call execute() you get a copy of example, so no worries at all about this?



I'm digging into struts documentation
Thanks in advance.







java tomcat struts2 struts






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 9 at 18:04

























asked Nov 9 at 17:11









DGoiko

1428




1428











  • There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
    – Dave Newton
    Nov 13 at 15:37










  • yeah, thats what I thought, thanks @DaveNewton.
    – DGoiko
    Nov 13 at 23:31
















  • There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
    – Dave Newton
    Nov 13 at 15:37










  • yeah, thats what I thought, thanks @DaveNewton.
    – DGoiko
    Nov 13 at 23:31















There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
– Dave Newton
Nov 13 at 15:37




There are any number of ways this could be handled; I generally did it with Spring since most every project used Spring. In any case, all you really need is a singleton that caches the response, so only the first hit incurs the cost. This isn't very tricky.
– Dave Newton
Nov 13 at 15:37












yeah, thats what I thought, thanks @DaveNewton.
– DGoiko
Nov 13 at 23:31




yeah, thats what I thought, thanks @DaveNewton.
– DGoiko
Nov 13 at 23:31

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53230397%2fstruts2-application-scope-instances%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53230397%2fstruts2-application-scope-instances%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Node.js puppeteer - Use values from array in a loop to cycle through pages

How do I collapse sections of code in Visual Studio Code for Windows?