【问题标题】:Alfresco : Increase document version when overriding file in ftpAlfresco:在 ftp 中覆盖文件时增加文档版本
【发布时间】:2013-01-03 12:47:17
【问题描述】:

我想在 ftp 中覆盖文件时增加次要文档版本。当我跟踪代码时,ContentDiskDriver2.truncateFile() 用于覆盖文件。在这个函数中,我使用versionService 来增加版本。以下代码写在 truncateFile() 试试 {

    NodeRef nodeRef = getNodeForPath(tree, DriverContent.FILE_OPEN_PARAMS.getPath());
    System.out.println("Node Ref: " + nodeRef);

    // Increase minor version to file.
    Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(2, 1.0f);
    versionProperties.put(Version.PROP_DESCRIPTION, "");
    versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR);

    VersionService versionService = (VersionService) applicationContext.getBean("versionService");
    versionService.createVersion(nodeRef, versionProperties);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

但不幸的是,我收到了这个错误。

2013-01-02 14:12:31,609  ERROR [org.alfresco.fileserver] [Sess_FTP3_192.168.1.166] Error from JLAN
 org.alfresco.error.AlfrescoRuntimeException: 00020073 Transaction must be active and synchronization is required: Thread[Sess_FTP3_192.168.1.166,5,FTPSessions]
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.registerSynchronizations(AlfrescoTransactionSupport.java:467)
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.getSynchronization(AlfrescoTransactionSupport.java:451)
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.getResource(AlfrescoTransactionSupport.java:244)
    at org.alfresco.repo.transaction.TransactionalResourceHelper.incrementCount(TransactionalResourceHelper.java:71)
    at org.alfresco.repo.policy.BehaviourFilterImpl.disableBehaviour(BehaviourFilterImpl.java:158)
    at org.alfresco.repo.version.Version2ServiceImpl.createVersion(Version2ServiceImpl.java:212)
    at org.alfresco.repo.version.Version2ServiceImpl.createVersion(Version2ServiceImpl.java:140)
    at org.alfresco.filesys.repo.ContentDiskDriver2.increaseVersion(ContentDiskDriver2.java:2937)
    at org.alfresco.filesys.repo.ContentDiskDriver2.truncateFile(ContentDiskDriver2.java:1652)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy97.truncateFile(Unknown Source)
    at org.alfresco.filesys.repo.NonTransactionalRuleContentDiskDriver.truncateFile(NonTransactionalRuleContentDiskDriver.java:480)
    at org.alfresco.filesys.repo.LegacyFileStateDriver.truncateFile(LegacyFileStateDriver.java:471)
    at org.alfresco.filesys.repo.BufferedContentDiskDriver.truncateFile(BufferedContentDiskDriver.java:532)
    at org.alfresco.jlan.ftp.FTPSrvSession.procStoreFile(FTPSrvSession.java:2262)
    at org.alfresco.jlan.ftp.FTPSrvSession.run(FTPSrvSession.java:4924)
    at java.lang.Thread.run(Thread.java:662)

您能帮我解决一下事务必须处于活动状态并且需要同步

我找到了这个链接.. Is the Alfresco repository document version history available via CIFS/FTP?

【问题讨论】:

    标签: ftp alfresco


    【解决方案1】:

    你已经被“小字母”与“大字母”户外服务所吸引

    “小字母”服务是原始服务,通常仅在其他 Alfresco 低级服务中使用。 “大信”服务是面向用户的封装服务,包括交易、审计、安全等。

    对于您的情况,您需要使用 Big Letter 表单,因此更改行

    VersionService versionService = (VersionService) applicationContext.getBean("versionService");
    

    给正确的一个:

    VersionService versionService = (VersionService) applicationContext.getBean("VersionService");
    

    您将获得一份带有事务、安全性等的 VersionService 副本,我认为这是您的情况所需要的。 (请注意,bean 是使用大首字母而不是小字母获取的)

    【讨论】:

    • 感谢您的解释...现在我可以根据您的解释解决...我找到了另一个替代解决方案。你能帮我检查一下吗?
    【解决方案2】:

    这是我找到的替代解决方案。明确使用事务。

        VersionService versionService = (VersionService) applicationContext.getBean("VersionService");
        TransactionService transactionService = (TransactionService) applicationContext.getBean("transactionService");
    
        UserTransaction tx = null;
        try {
            tx = transactionService.getUserTransaction();
            tx.begin();
            versionService.createVersion(nodeRef, versionProperties);
            tx.commit();
        } 
        catch (Exception e) 
        {
            if(tx != null)
            {
                try
                {
                    tx.rollback();
                } catch (IllegalStateException e1) 
                {
                    e1.printStackTrace();
                } catch (SecurityException e2) 
                {
                    e2.printStackTrace();
                } catch (SystemException e3) 
                {
                    e3.printStackTrace();
                }
            }
        }
    

    【讨论】:

    • 我建议不要这样做。如果你真的想直接使用小信服务(因此担心安全性、审计等),你会想要使用 RetryingTransaction 来代替。否则,当发生可重试问题(主要是事务冲突)时,您将遇到间歇性故障
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多