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.
Aspect cm:temporary is sometimes very useful. If you want to delete a node immediately without moving the node to paper bin (archive store) adding cm:temporary aspect before deletion solves your prob. Nodes with cm:temporary attached will deleted without detour via paper bin:
nodeService.addAspect(nodeRef, ContentModel.ASPECT_TEMPORARY, null);
Puh, long time without updating my blog…Why? I’m currently doing a nice Alfresco Share customization project. I’ll post about this when we’re finished.
Topic of this post is a little bit different. My idea raised a year ago, but I realized that I won’t do it myself…idea?
here it is:
There are plenty of Alfresco partners worldwide & also a lot of interesting projects are going on. My motto was (& still is) learning by doing, hands on. So why not doing something I’m calling “Alfrescian World Tour”:
One year participating in Alfresco projects around the world, at least one in each continent! Joining for 1 or 2 month a project, learn a lot of new topics & then go to the next project. Thanks to twitter, blogs etc. it will be no problem to find interesting projects and perhaps Nancy Garrity (Alfresco Community Manager) is able to support this Tour somehow. After finishing the tour I wanted to write a book about it…
I think this will be a nice travel for a graduate taht wants to gain a lot of knowledge in Alfresco and ECM. I haven’t discussed this with my boss, but I think i can offer a 1-2 month project at westernacher in Germany.
So, Alfrescians: Is there anybody out there?
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.
While developing opsoro last year I fall in love with ExtJS. Since then a few new things where developed around ExtJS, for example Ext GWT (GXT).
I took a look into GXT several weeks or months ago and decided to try this framework in my next little project…
Beside GXT I wanted also to dive into the “CMIS world” and the best way to do this is always “hands on”!
Thus I’m just getting a new job (more Alfresco 😉 I need to refresh my knowledge…). So I started 2 nights ago with my new project: Alfrescian CMIS browser!
It’s currently a little bit scrubby, but here is a first screenshot:
Some technical details:
- I’m using the CMIS AtomPub-Binding
- Folder tree & document grid using async GWT-RPC Services which are using Abdera libs to call the repo
opsoro is an alternative web client for Alfresco. Its goal was to provide an easier user interface with a richer user experience by leveraging the latest web technologies. Like Alfresco, opsoro is open source software released under the GPL.
opsoro started out as a Prototype and is still in an early state. Nevertheless I encourage anyone who is familiar with alfresco to test opsoro client. Even if it is not production ready yet, it demonstrates the possibilities which lie in rich web applications and the Alfresco Web Script API
But, opsoro is more than a year ago. It is time for a new project! So stay tuned 😉