2013-01-02 67 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