2016-12-17 76 views
0

我們在生產中使用JackRabbit。不幸的是,我們必須在倉庫一些不一致的地方,這使得無法讀取這些數據:如何解決Jackrabbit JCR(BundleFsPersistenceManager)中的不一致問題

ERROR ResourceServiceImpl - RepositoryException to JCR javax.jcr.PathNotFoundException: 1661b5c

Spring bean配置是這樣的:

<bean id="repository" class="org.apache.jackrabbit.core.RepositoryImpl" destroy-method="shutdown"> 
    <constructor-arg index="0" ref="config" /> 
    </bean> 
    <bean id="config" class="org.apache.jackrabbit.core.config.RepositoryConfig" factory-method="create"> 
    <constructor-arg index="0" ref="jcrXml"/> 
    <constructor-arg index="1" value="${instance.repository}" /> 
    </bean> 

    <bean id="jcrXml" class="com.example.misc.InputStreamBeanFactory" factory-method="createStream"> 
    <constructor-arg value="/jackrabbit-repository.xml" /> 
    </bean> 
    <bean name="jcrSession" factory-bean="repository" factory-method="login" scope="session" destroy-method="logout" /> 

workspaces.xml看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?><Workspace name="default"> 
    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> 
     <param name="path" value="${wsp.home}"/> 
    </FileSystem> 
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/> 
</Workspace> 

從我學到的(太晚)here,上面配置的BundleFsPersistenceManager可能會變得不一致。這也寫在這裏應該被用於生產。那麼,它現在正在生產,以前沒有人注意到這一點,我們想交換這一點。但首先我們必須遷移數據,因此我們需要修復它。

我的問題:有沒有辦法解決這個問題還是這些數據丟失的好?

我的第二個問題:我們可以做些什麼來避免將來出現這些問題?

回答

0

有關於Adobe CQ - Repository Inconsistency(使用Jackrabbit)的持久性管理器上可設置的附加check..參數的說明。 Magnolia - JCR Troubles有一個用於搜索和刪除損壞節點的腳本示例。我已經看到了一種將此腳本的邏輯(用java編寫)組合起來的方法,並且檢查參數允許一個存儲庫重新啓動並運行足夠長的時間以便將內容取出。

爲了避免將來出現的問題 - 你想要一個獨立的設置,不使用RDBMS - 我建議org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager

<PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager"> 
     <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/> 
     <param name="schemaObjectPrefix" value="${wsp.name}_"/> 
    </PersistenceManager>