Hi Robert. Are you looking for a reason to use PreThreadValue? Or do you just want to have a page/component level property that you can access for the life of the request?
In a page or component you just declare the variable and let tapestry do it's magic in the background. private int widgetRenderCount = 0; void afterRender() { ++widgetRenderCount; log.debug("{} widgets have now rendered in this request!", count); } If you want to use it in a singleton service then you need to do the plumbing. Josh On Wed, Nov 28, 2012 at 2:32 PM, Robert Hailey <rhai...@allogy.com> wrote: > > I've read the "everyone out of the pool" blog post, but have not been able > to find an example of how to best use per-thread value on a page or service > (seems like what's provided is an internal tapestry case). > > As a (lazy?) tapestry developer, my first thought is to try this: > > @Inject > private PerThreadValue<Integer> widgetRenderCount; > > Which probably isn't the expected use-case, because it doesn't work: "no > service implements PerThreadValue interface" (or thereabout) > > I then though I was probably looking one abstraction layer too deep (as > the article does talk about transparent perthread access)... so then I > thought of this: > > @Inject > @PerThread > private Integer widgetRenderCount; > > Which made a degree of sense because "Persist" is deprecated, but no such > annotation exists. > > So then I thought I could create my own perthreadvalue-providing service > (to realize the first example) like this: > > public void contributeMasterObjectProvider( > OrderedConfiguration<ObjectProvider> configuration, > final PerthreadManager perthreadManager > ) > { > configuration.add("PerThreadValue", new ObjectProvider() { > public <T> T provide(Class<T> tClass, AnnotationProvider > annotationProvider, ObjectLocator objectLocator) { > return (T)perthreadManager.createValue(); > } > }); > } > > ... but that fails due to the "MasterObjectProvider somehow depends on > itself" error message and what's probably a blindingly-obvious lack of > knowledge on my part concerning how tapestry actually provides virtually > interfaced objects. > > So now I have fallen back to patterns like this, that seem to work, but > seem to be much clunkier than I would expect: > > @Inject > private PerThreadManager perThreadManager; > private static PerThreadValue<Integer> widgetRenderCount; > > void afterRender() { > if (widgetRenderCount==null) { > widgetRenderCount=perthreadManager.createValue(); > } > int count=widgetRenderCount.get(0); > count++; > log.debug("{} widgets have now rendered in this request!", > count); > widgetRenderCount.set(count); > } > > > Am I missing something? If so, how is PerThreadValue intended to be used? > > -- > Robert Hailey > > >