tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Peter Stavrinides (JIRA)" <j...@apache.org>
Subject [jira] Commented: (TAP5-795) Tapestry IoC should provide an OrderedConfiguration for EagerLoaded services
Date Tue, 28 Jul 2009 07:51:15 GMT

    [ https://issues.apache.org/jira/browse/TAP5-795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12735973#action_12735973
] 

Peter Stavrinides commented on TAP5-795:
----------------------------------------

Choosing not to deal with it in the container is an incongruous approach, service orchestration
is an important extension of the service composition model... it certainly seems to be built
in to most parts of  Tapestry IoC already. Tapestry already deals with many aspects of orchestration
when providing contributions and constructing pipelines, so what makes eagerloading the exception?



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


Mime
View raw message