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

Reply via email to