俞黎敏ID:YuLimin
83345次访问,排名1070好友20人,关注者244
阿敏总司令:简单就是美!
博客:http://YuLimin.JavaEye.com

只有正确地找到问题的根本所在,才能成功地解决掉问题:)
Read a bit and take it out, then come back read some more.
YuLimin的文章
原创 62 篇
翻译 0 篇
转载 0 篇
评论 65 篇
阿敏总司令的公告
三等功
俞黎敏
阿敏总司令
来自:福建莆田@广州
最近评论
yd1221:ǒu lái nǐ de dì pán cǎi cǎi ,hē hē ,xī wàng yě dào wǒ de dì pán zhuǎn zhuǎn ɑ !
偶 来 你 的 地 盘 踩 踩 ,呵 呵 ,希 望 也 到 我 的 地 盘  转  转 啊 !



 — 快典网( http://kdd.cc/ )自动注音
myshijieye:love注册香港公司
健康管理
pvc door
服装批发
jamesqiu:花点时间学习gvim,这是值得的。
007pro:je上核心人员都是极端务实的人群,有时候我觉得怎么可以这样,je的核心会觉的说,最好这样~就是这么简单。
我也是被隐藏扣分之后才明白,所以即便是博客上也对这类事情不做评述,虽然我是很支持你的
所以即便象俞兄这样的用户也不会有特权的,我记得老庄很久以前叹息说多亏有自己的空间,的确如此。
oneyear2008:我刚接触java,这对于我来说是一个很好的学习步骤!谢谢!
文章分类
收藏
    相册
    1大学的我
    2部队当兵
    3生活相片
    CSDN好友
    【HongSoft@业务整合】(RSS)
    axman
    Java憩园
    jini李日贵
    lizongbo
    zxhong(RSS)
    椅子(HERO2008第三会场主持人)
    用耳朵去聆听,用心来感受
    苏酩的Blog空间
    超越黎明(RSS)
    银狐999(RSS)
    青润心情(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Alfresco 2.0 解读收藏

    新一篇: 可重用的 Hsqldb 启动、停止之 Ant 任务脚手架 | 旧一篇: 忍无可忍,决定宁可错杀千万,也不漏掉一个,弹已出膛,剑已出鞘!

    Alfresco 2.0 解读
     
    一、介绍
    Alfresco is the Open Source Alternative for Enterprise Content Management (ECM), providing Document Management, Collaboration, Records Management, Knowledge Management, Web Content Management and Imaging.
     
    采用的技术
    Java
    Spring Aspect-Oriented Framework
    ACEGI – Aspect-Oriented Security Framework
    MyFaces JSF Implementation
    Hibernate ORM Persistence
    Lucene Text Search Engine
    JLAN
    POI File Format Conversion
    PDFBox – PDF Conversion
    OpenOffice
    jBPM
    Rhino JavaScript engine
    支持的接口
    CIFS/SMB Microsoft File Share Protocol
    JSR-168 Portlet Specification
    JSR-127 Java Server Faces
    FTP
    WebDAV
    Web Services
    REST
     

    二、配置解读
    1、从web.xml开始入手
    其它的略过,在 web.xml 中可以看到加载了如下 Spring 配置文件
    <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>
         classpath:alfresco/web-client-application-context.xml
         classpath:web-services-application-context.xml
         classpath:alfresco/web-api-application-context.xml
         classpath:alfresco/application-context.xml
     </param-value>
                <description>Spring config file locations</description>
    </context-param>
    web client 层
    alfresco/web-client-application-context.xml
    打开它可以看到它引入了所有的 alfresco/web-client*.xml & alfresco/extension/web-client*.xml & jar:*!/META-INF/web-client*.xml
    web api 层
    alfresco/web-api-application-context.xml
    打开它可以看到它引入了 alfresco/web-api-config.xml & alfresco/extension/web-api-config-custom.xml
    web service 层
    web-services-application-context.xml
    刚开始找这个文件时,居然没有找到,怪事!not exist???why?
    于是后来才发现这个文件是在 remote-api.jar 包里,晕,不是很好的做法啊。
    bean 配置定义关键的文件
    alfresco/application-context.xml
        <import resource="classpath:alfresco/core-services-context.xml"/>
        <import resource="classpath:alfresco/public-services-context.xml"/>
        <import resource="classpath:alfresco/model-specific-services-context.xml"/>
        <import resource="classpath:alfresco/action-services-context.xml"/>
        <import resource="classpath:alfresco/rule-services-context.xml"/>
        <import resource="classpath:alfresco/node-services-context.xml"/>
        <import resource="classpath:alfresco/scheduled-jobs-context.xml"/>
        <import resource="classpath:alfresco/network-protocol-context.xml"/>
        <import resource="classpath:alfresco/content-services-context.xml"/>
        <import resource="classpath:alfresco/hibernate-context.xml"/>
        <import resource="classpath:alfresco/ownable-services-context.xml"/>
        <import resource="classpath:alfresco/template-services-context.xml"/>
        <import resource="classpath:alfresco/script-services-context.xml"/>
        <import resource="classpath:alfresco/index-recovery-context.xml"/>
        <import resource="classpath:alfresco/authority-services-context.xml"/>
        <import resource="classpath:alfresco/authentication-services-context.xml"/>
        <import resource="classpath:alfresco/policy-context.xml"/>
        <import resource="classpath:alfresco/import-export-context.xml"/>
        <import resource="classpath:alfresco/bootstrap-context.xml"/>
        <import resource="classpath:alfresco/workflow-context.xml"/>
        <import resource="classpath:alfresco/jcr-api-context.xml"/>
        <import resource="classpath:alfresco/avm-services-context.xml"/>
        <import resource="classpath:alfresco/audit-services-context.xml"/>
        <import resource="classpath*:alfresco/patch/*-context.xml"/>
        <import resource="classpath*:alfresco/domain/*-context.xml"/>
     
        <!--
             Import all modules and related components.
             Extensions are explicitly imported after this so that the default
             mechanism can still be used to override module-specific beans.
        -->
        <import resource="classpath*:alfresco/module-context.xml"/>
     
        <!--
             Import of general extensions and bean overrides.
     
             To give developers final control over the tuning
             of their own local build, the dev-context.xml file
             is processed last (note: dev-context.xml isn't
             part of the source tree itself). 
            
             For details, see:
             http://wiki.alfresco.com/wiki/Developer_Runtime_Configuration
        -->
        <import resource="classpath*:alfresco/extension/*-context.xml"/>
        <import resource="classpath*:alfresco/extension/dev-context.xml"/>
     
    可以看到分层次地进行加载不同的 bean ,并且在后面提供可扩展的 bean 定义的引入,方便进行扩展,而不需要更变这个配置文件
     
    继续一个个往下看,并把一些重要的 bean 配置拿出来:
    core-services-context.xml 核心 bean 的配置
    看到配置了 JMX 的服务
    <!-- Custom MBeanServer -->
    <bean id="alfrescoMBeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
     
    <bean id="registry"   class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="port" value="${avm.remote.port}"/>
    </bean>
    <!-- MBeanServer Connector (registers itself with custom alfrescoMBeanServer) -->
    <bean id="serverConnector"
          class="org.springframework.jmx.support.ConnectorServerFactoryBean"
          depends-on="registry">
     
        <property name="server"      ref="alfrescoMBeanServer"/>
        <property name="objectName" value="connector:name=rmi"/>
        <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:${avm.remote.port}/alfresco/jmxrmi"/>
     
        <property name="environment">
            <map>
                <!-- The following keys are only valid when sun jmx is used -->
                <entry key="jmx.remote.x.password.file" value="${alfresco.jmx.dir}/alfresco-jmxrmi.password"/>
                <entry key="jmx.remote.x.access.file"   value="${alfresco.jmx.dir}/alfresco-jmxrmi.access"/>
            </map>
        </property>
    </bean>
    <!-- MBeans registered with alfrescoMBeanServer -->
    <bean id="VirtServerRegistry"
          class="org.alfresco.mbeans.VirtServerRegistry"
          init-method="initialize">
     
    JMX 服务暴露
    <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
      <property name="server" ref="alfrescoMBeanServer"/>
       <property name="beans">
         <map>
           <!-- MBeans to register with alfrescoMBeanServer -->
           <entry key="Alfresco:Name=VirtServerRegistry,Type=VirtServerRegistry" value-ref="VirtServerRegistry"/>
           <entry key="Alfresco:Name=FileServerConfig,Type=FileServerConfig" value-ref="FileServerConfig"/>
         </map>
       </property>
    </bean>
     
    同时暴露了 RMI 的服务
    RMI
    <!-- The RMI export of the repo remote transport. -->
    <bean id="repoRemoteTransportRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
                <property name="service">
                            <ref bean="repoRemoteTransport"/>
                </property>
                <property name="serviceInterface">
                            <value>org.alfresco.service.cmr.remote.RepoRemoteTransport</value>
                </property>
                <property name="serviceName">
                            <value>repo</value>
                </property>
                <property name="registryPort">
                            <value>${avm.remote.port}</value>
                </property>
    </bean>
     
    验证 bean 配置,也是同时暴露了 RMI 的服务
    authentication-services-context.xml
    <!-- Here for now. Probably want remote-context.xml file. -->
    <!-- The AuthenticationService exported as an RMI service. -->
    <bean id="rmiAuthenticationService" class="org.springframework.remoting.rmi.RmiServiceExporter">
                <property name="service">
                            <ref bean="AuthenticationService"/>
                </property>
                <property name="serviceInterface">
                            <value>org.alfresco.service.cmr.security.AuthenticationService</value>
                </property>
                <property name="serviceName">
                            <value>authentication</value>
                </property>
                <property name="registryPort">
                            <value>${avm.remote.port}</value>
                </property>
    </bean>
     
    avm 里也暴露了 RMI 的服务
    avm-services-context.xml
    <!-- The RMI wrapper around the AVM remote interface. -->
     
    <bean id="avmRemoteService" class="org.springframework.remoting.rmi.RmiServiceExporter">
                <property name="service">
                            <ref bean="avmRemoteTransport"/>
                </property>
                <property name="serviceInterface">
                            <value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
                </property>
                <property name="serviceName">
                            <value>avm</value>
                </property>
                <property name="registryPort">
                            <value>${avm.remote.port}</value>
                </property>
    </bean>
                           
    <bean id="avmSyncServiceTransport" class="org.alfresco.repo.avm.AVMSyncServiceTransportImpl">
        <property name="authenticationService">
            <ref bean="AuthenticationService"/>
        </property>
        <property name="avmSyncService">
            <ref bean="AVMSyncService"/>
        </property>
    </bean>
                           
    <bean id="avmSyncServiceTransportRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="service">
            <ref bean="avmSyncServiceTransport"/>
        </property>
        <property name="serviceInterface">
            <value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>
        </property>
        <property name="serviceName">
            <value>avmsync</value>
        </property>
        <property name="registryPort">
            <value>${avm.remote.port}</value>
        </property>
    </bean>
     
    通过上面的 JMX 与 RMI 暴露在不同的配置文件里可以看到,如果我要去掉 JMX 或 RMI 服务的话,需要修改 N 个的配置文件,实在是麻烦。
    建议要二次开发时根据需要进行整理,合并到一个文件里进行暴露即可,或者没有需要的话就直接 delete 掉这些:)
     
    而且这个 JMX RMI 服务的暴露,导致你不能仅重启应用就可以,而非得重启整个应用服务器才行,要不然会报服务已启动,即默认的端口50500被占用了,而整个应用启动不了,麻烦。除非你在重启应用之前再去修改一下配置文件里的端口号,呵呵。
     
    不过,最终的解决办法是象我在 Jmx4Log4J 里那样自己去再封装一个获取端口号的类,发现有人用了,就找下一个:)这样就OK了。
     
    core-services-context.xml
    <!-- Datasource bean -->
    数据库连接池用的居然是 org.apache.commons.dbcp.BasicDataSource ,大家自己改吧 c3p0 等等
     
    邮件
    <!-- MAIL SERVICE           -->
    <bean id="mailService" class="org.springframework.mail.javamail.JavaMailSenderImpl">
     
    Lucene 索引和搜索 API
         <!-- Indexing and Search API -->
        <bean id="indexerComponent" class="org.alfresco.repo.search.IndexerComponent">
        <bean id="searchService" class="org.alfresco.repo.search.SearcherComponent">
     
        <!-- Indexer and searchers for lucene -->
        <bean id="luceneIndexerAndSearcherFactory"
            class="org.alfresco.repo.search.impl.lucene.LuceneIndexerAndSearcherFactory2">
     
        <!-- Indexer and searchers for lucene -->
        <bean id="luceneCategoryService" class="org.alfresco.repo.search.impl.lucene.LuceneCategoryServiceImpl">
     
        <!-- Lock Service           -->
        <bean id="lockService" class="org.alfresco.repo.lock.LockServiceImpl" init-method="initialise">
     
    版本控制
        <!-- Version Service   -->
        <bean id="versionService" class="org.alfresco.repo.version.VersionServiceImpl" init-method="initialise">
     
    数据库
        <!-- Data Dictionary -->
        <bean id="dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="resourceBundles">
            <property name="models">
                <list>
                    <!-- System models -->
                    <value>alfresco/model/dictionaryModel.xml</value>
                    <value>alfresco/model/systemModel.xml</value>
                    <value>org/alfresco/repo/security/authentication/userModel.xml</value>
     
                    <!-- Content models -->
                    <value>alfresco/model/contentModel.xml</value>
                    <value>alfresco/model/bpmModel.xml</value>
                    <value>alfresco/model/wcmModel.xml</value>
                    <value>alfresco/model/forumModel.xml</value>
     
                    <!-- Content models -->
                    <value>alfresco/model/applicationModel.xml</value>
                    <value>alfresco/model/wcmAppModel.xml</value>
                   
                    <!-- Implementation models -->
                    <value>org/alfresco/repo/action/actionModel.xml</value>
                    <value>org/alfresco/repo/rule/ruleModel.xml</value>
                    <value>org/alfresco/repo/version/version_model.xml</value>
                   
                    <!-- Deprecated types -->
                    <value>alfresco/model/deprecated/deprecated_contentModel.xml</value>
                </list>
            </property>
            <property name="labels">
                <list>
                    <value>alfresco/model/dataTypeAnalyzers</value>
                    <value>alfresco/messages/system-model</value>
                    <value>alfresco/messages/dictionary-model</value>
                    <value>alfresco/messages/content-model</value>
                    <value>alfresco/messages/bpm-messages</value>
                    <value>alfresco/messages/application-model</value>
                    <value>alfresco/messages/forum-model</value>
                </list>
            </property>
        </bean>
     
    拷贝
        <!-- Copy Service    -->
        <!-- Note this uses the node service that enforces permissions so you can only copy what you can see -->
        <bean id="copyService" class="org.alfresco.repo.copy.CopyServiceImpl" init-method="init">
     
    检出 / 检入
        <!-- CheckOut/CheckIn Service -->
        <bean id="checkOutCheckInService" class="org.alfresco.repo.coci.CheckOutCheckInServiceImpl">
     
    全文搜索
        <!-- Bean to support full text search -->
        <bean id="LuceneFullTextSearchIndexer"
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     
    Lucene 索引文件备份
        <!-- Bean to backup Lucene indexes -->
       <bean id="luceneIndexBackupComponent"
              class="org.alfresco.repo.search.impl.lucene.LuceneIndexerAndSearcherFactory2$LuceneIndexBackupComponent">
     
        <!-- Registry service -->
        <bean id="registryService" class="org.alfresco.repo.admin.registry.RegistryServiceImpl" init-method="init">
     
        <!-- A Simple Filesystem like API for the repo implementation.
                     Unfinished, experimental, and probably ephemeral. -->
        <bean id="repoRemoteService" class="org.alfresco.repo.remote.RepoRemoteService">
     
                <!-- Transactionally wrapped version of above. -->
        <bean id="RepoRemoteService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    public-services-context.xml
    当中引入了
        <import resource="classpath:alfresco/public-services-security-context.xml"/>
    public-services-security-context.xml 安全认证相关
    使用的是 Acegi 组件,当中引入了
        <import resource="classpath:alfresco/cache-context.xml" />
     
    cache-context.xml Cache 相关的,使用的是 EHCache
       <bean name="transactionalEHCacheManager" class="org.alfresco.repo.cache.EhCacheManagerFactoryBean">
          <property name="configLocation">
             <value>classpath:alfresco/ehcache-transactional.xml</value>
          </property>
       </bean>
    public-services-context.xml
        <!-- Service Registry -->
        <bean id="ServiceRegistry" class="org.alfresco.repo.service.ServiceDescriptorRegistry"/>
     
    基本上服务都从这里注入并从中获取,树结构,当中有Spring Bean Factory
     
    model-specific-services-context.xml
       <!-- File/folder specific service -->
       <bean name="fileFolderService" class="org.alfresco.repo.model.filefolder.FileFolderServiceImpl" init-method="init">
     
       <bean name="tempFileMarkerInterceptor" class="org.alfresco.repo.model.filefolder.TempFileMarkerInterceptor">
     
       <!-- Multilingual specific service -->
       <bean name="multilingualContentService" class="org.alfresco.repo.model.ml.MultilingualContentServiceImpl">
    action-services-context.xml Action 相关的
    用 Thread local containing the current action chain
        <!-- Action Service -->
        <bean id="actionService" class="org.alfresco.repo.action.ActionServiceImpl">
    rule-services-context.xml 规则、触发规则服务
    <!-- Rules Service -->
    <bean id="ruleService" class="org.alfresco.repo.rule.RuleServiceImpl">
    <!-- Rules Aspect -->
    <bean id="rulesAspect" class="org.alfresco.repo.rule.RulesAspect" init-method="init">
    <!-- Rule triggers -->
    <bean id="rule-trigger-base" abstract="true" init-method="registerRuleTrigger">
    node-services-context.xml 节点相关服务
    <!-- Beans pertinent to node persistence and services