I recently faced an upgrade from a single node Alfresco into a high available (HA) configuration (1 Load-Balancer, 2 Alfresco Nodes, 2 Share Nodes) using Alfresco Enterprise 3.4.2 (including kerberos SSO etc.).
The Basic steps (@see Kevs blog post http://blogs.alfresco.com/wp/kevinr/2011/07/28/using-apache-to-load-balance-alfresco-share-with-an-alfresco-repository-cluster-and-clustering-alfresco-share/) went well & my new system performed well. But then I realized that changes to a Share dashboard weren’t visible on the other Share instance. I forget to add the following configuration (“custom-slingshot-application-context.xml”):
<bean id="webframework.slingshot.persister.remote" class="org.springframework.extensions.surf.persister.PathStoreObjectPersister" parent="webframework.sitedata.persister.abstract">
<property name="store" ref="webframework.webapp.store.remote" />
But now my Share instances were very slow (dashboard layout changes weren’t visible on the other Share instance either). Loading a dashboard in the browser took up to 8s – without that cache disabling ~2s. Thus I made some tests with a vanilla 3.4.2 & 3.4.6 system and observed the same behavior (not as slow because I didn’t created a few hundred sites & >2000 users in my local system).
First of all I backported the 4.0.c org.springframework.extensions.webscripts.RequestCachingConnector that improved the whole Share performance a little bit. Afterwards I thought about the situations when a cached SURF object must be invalidated and reloaded via its remote store. AFAIK the only moment is when a dashboard configuration is changed on another Share instance. As my configuration only incorporates 2 Share instances I developed the follwing simple tweak to notify the other Share instance if a dashboard config is changed & the Surf object cache should be invalidated:
re-enable caching for component & pages
- add a new HTTP endpoint (used to notify the other Share instance via HTTP if the SURF caches should be invalidated):
<config evaluator="string-compare" condition="Remote">
<!-- Connector instance -->
<name>Share Cluster Connector</name>
<description>HTTP Connector used to notify other share cluster nodes if surf object cache should be invalidated</description>
<!-- Endpoint -->
<name>Share Cluster Remote API</name>
- append the following lines to site-webscripts\org\alfresco\components\dashboard\customise-dashboard.post.json.js:
var shareClusterConnector = remote.connect("share-cluster");
shareClusterConnector.post("/api/fme/cache", clientRequest, "application/json");
//nothing to do
- added a new Java-backed webscript (Share) mapped to URI api/fme/cache with following executeImpl():
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status)
RequestContext rc = ThreadLocalRequestContext.getRequestContext();
// we must reset the SpringMVC view resolvers - as they maintain a reference to View
// object which could themselves reference pages or templates by ID
Map<String, ViewResolver> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
applicationContext, ViewResolver.class, true, false);
for (ViewResolver resolver : matchingBeans.values())
if (resolver instanceof AbstractCachingViewResolver)
logger.info("cleared AbstractCachingViewResolver " +resolver);
The following things should be kept in mind:
- this scenario only works with 2 Share instances & has to be enhanced if you’ve more than 2 nodes
- api/fme/cache is not secured via an authenticator …
I’ll fill (& link) a detailed jira issue shortly.
Alfresco uses a concept called tagscope caching to support performant tagging services in Alfresco Share. Each folder representing a site or a site container (doclib, wiki…) has a d:content property cm:tagScopeCache thats acts as a tag cache. More detailed this property is a txt-file that contains a list of tags & their quantity, e.g.:
var refresh = actions.create("refresh-tagscope");
for each(item in folder.children)
Steps to use this script:
- Upload js to data dictionary / Scripts
- navigate in JSF client to site or site container where you want to refresh your tagScopeCache
- open details page of folder
- Run Action -> Execute Script & choose the uploaded script.
I’m an active twitter user since march & and I’m currently working on a Share customization project (intranet knowledge portal).
Now, I’m wondering if it is a nice idea to add sth. like a internal twitter system to Share. Alfresco’s Activity Feed is a nice approach to track each activity, but in a system with more than hundred members of a site this feed gets very chattering. So, my basic idea:
- reuse twitter syntax (@, DM, RT & #)
- # –> automatically tag the message
- twitter user-dashlet (like BeTwittered Google Gadget)
- site-dashlet: last messages of site members
- action link in DocLib, wiki etc. “recommed via twitter”:
– opens dialog to write twitter message
– autocompletion for user names typing @ or DM
– automatically add shortened link to content
- decide if each member follows all other site members or reuse twitter-like follow mechanism
So…what do you think about this?
I just recognized thats Alfresco Share has some really bad behaviour handling documents with the same name:
- Upload a a new document to Share doclib, e.g. called test.doc
- Upload another test.doc document with other content to the same space/folder via Share
- What happened? The 2nd upload overwrites the first one, the content property has been replaced, the first test.doc content has gone…
Upps! Please don’t try this with your boss’s 200 page concept 😉
I followed this in Enterprise 3.0.1 & Ent. 3.1…
I’ll raise an issue when I recover my JIRA credentials.
I’m currently writing a concept of a knowledge management portal based on Alfresco Share. The Alfresco guys are adding some missing features to Share in the next release(s), e.g. support of custom meta-data, Rules & Actions. But I’m missing a few other things, one of them I’d like to discuss in this post.
What about Role based configuration? I think it is quite often that you’d like to configurate, that for example a consumer doesn’t see some adminitrative components or Dashlets you’ve added to Share to support your use case.
I know that you can achieve this by custom coding (Or am I missing sth.?), but from my point of view this should be an configuration task.
As discussed in my prevoius post, Alfresco Share is currently missing support for custom metadata.
Gavin Cornwell (Alfresco) gives a preview of the comming support in 3.2 Enterprise here
I’m sure, that the new REST based Form Service will help a lot of developers!
Alfresco ist currently designing an iPhone client for their collaboration platform Share. Thus I get an iPod touch from Alfresco as price for winning the Alfresco Developer Challenge a year ago I’m very interested in this stuff.
Here are the wireframes of the user stories at slideshare.
But I’m not sure if this is a real must for Share…I’m not sure if the user NEED this client. Of course Alfresco will gain a lot of marketing momentum offering an “iPhone-Enterprise-Collaboration” app. Does Sharepoint have sth. like that 😉
BUT, from my point of view there are other 1st prio features enterprise customers really need:
- supporting custom Types, Aspects and Metadata (docLib & search)
- group based site membership (& more permission stuff like, SiteCreatorGroup etc.)
- combination of Share & MS Sharepoint protocol usage within MS Office
- Support of Rules inside of Share
Most of these features are part of the Alfresco roadmap. Specially the support of custom types & aspects within Share is a real MUST.
I’m doing ECM-Projects since a while and I cannot remember a project where we used only basis types and metadata.
To sum up:
It’s cool that Alfresco is always developing new stuff, that’s why I love it. But from my point Share is lacking some features which should be done before going onwards with other new apps.