[ https://issues.apache.org/jira/browse/TAP5-795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12736056#action_12736056 ]
Massimo Lusetti commented on TAP5-795: -------------------------------------- Well eager loading is somehow an edge case which has been (ab)used for starting service at runtime bootstrap, then has been introduced the RegistryStartup service. I don't mean that an ordering on eager loading is bad, I just say it not seems the right solution for your use case and, as you said, it's more like an extension to IoC. Cheers > 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(). This is somewhat counter > productive in a sense as you can get into serious trouble If ordering of > eagerloaded services is important (and very often it is, as the very concept > implies ordering and availability before other services), yet ordering is > ignored for eagerloaded services? > So by using : > binder.bind(SomeService.class).eagerLoad(); you can produce a NPE or > potentially work just fine and this IoC quirk goes undetected, which is a > ticking time bomb. Perhaps this method should be renamed to > eagerLoadUnordered() or better yet removed entirely, and another way of > ordering these should be introduced. > 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 ImageService 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 will solve > 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.