2013-01-02 29 views
0

我想在ftp覆盖文件时增加次要文档版本。当我追踪代码时,ContentDiskDriver2.truncateFile()用于覆盖文件。在这个函数里我使用versionService来增加版本。下面的代码是写在truncateFile() 尝试{Alfresco:在ftp覆盖文件时增加文档版本

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?

回答

1

你已经被“小信”中招vs“Big Letter”Alfresco服务

“小信”服务是原始服务,通常只在其他Alfresco低端服务中使用。 “大信”服务是面向用户的服务,包括交易,审计,安全等

对于您的情况下,预包装用户,你需要使用大字母的形式,所以改线

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

要正确的:

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

,你会得到的VersionService的副本,交易,安全性等,这是我认为你需要为你的情况。 (请注意,豆是用大写字母而不是小写字母取代的)

+0

感谢您的解释......现在我可以根据您的解释来解决....我找到了另一种替代解决方案。你能帮我检查一下吗? – swemon

0

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

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(); 
      } 
     } 
    } 
+0

我会建议不要这样做。如果您确实想直接使用小写字母服务(因此担心安全性,审核等),您将需要使用RetryingTransaction。否则,当发生可重试问题(主要是事务冲突)时,您会出现间歇性故障 – Gagravarr

+0

感谢您的建议..我只用你的方式.. – swemon