[ https://issues.apache.org/jira/browse/TAP5-795?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Peter Stavrinides updated TAP5-795: ----------------------------------- Summary: Tapestry IoC should provide an OrderedConfiguration for EagerLoaded services (was: Tapestry IoC should provide an OderedConfiguration for EagerLoaded services) > Tapestry IoC should provide an OrderedConfiguration for EagerLoaded services > ---------------------------------------------------------------------------- > > Key: TAP5-795 > URL: https://issues.apache.org/jira/browse/TAP5-795 > Project: Tapestry 5 > Issue Type: Improvement > Components: tapestry-ioc > Affects Versions: 5.1 > Environment: Any > Reporter: Peter Stavrinides > Priority: Critical > > It is mentioned in the documentation that the order in which services are > created is not defined when using eagerLoad(). > You can get into serious trouble If ordering of eagerloaded services is > important (and it often is) by using : > binder.bind(ImageService.class).eagerLoad(); > It can produce a NPE or work just fine and go undetected, so is a ticking > time bomb. Perhaps this method should be renamed to eagerLoadUnordered() or > removed entirely, and a way of ordering these would be great to have. An > illustrative example is given below with two eagerloaded services > (SiteInitialise sets up database connections and the connection pool, > ImageService loads a cache of image data, so implicitly requires > SiteInitialise to be loaded first). > //Example: The shell of the eagerloaded ImageService service > public class ImageService { > /** Cache to hold thumbnail images */ > private static ConcurrentHashMap<Integer, Thumbnail> > imageCache_ = new ConcurrentHashMap<Integer, Thumbnail>(); > > public void preloadImageCache() { > DbConnection connection = null; > try { > //This can potentially turn into a Null Pointer > Exception as the startup order is arbitrary > connection = > DatabaseConnection.getReadConnection(); > //database query > } catch (Exception e) { > //handle exception > } > } > public static ImageService build() { > return new ImageService(); > } > public ImageService() { > preloadImageCache(); > } > } > //Workaround: adding a dependency on the other eagerloaded service solves > it, but this is not a practical solution if there are many of these > services > public class ImageService { > /** Cache to hold thumbnail images */ > private static ConcurrentHashMap<Integer, Thumbnail> > imageCache_ = new ConcurrentHashMap<Integer, Thumbnail>(); > > public void preloadImageCache() { > DbConnection connection = null; > try { > connection = > DatabaseConnection.getReadConnection(); > //database query > } catch (Exception e) { > //handle exception > } > } > public static ImageService build(SiteInitialise > siteInitialise) { > return new ImageService(siteInitialise); > } > public ImageService(SiteInitialise siteInitialise) { > if(siteInitialise.isConnectionOk()) > preloadImageCache(); > } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.