[ 
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.

Reply via email to