Методы создания и обновления вызываются дважды для каждого расширения хранилища tridion.

Я не могу понять, почему моя пользовательская файловая система DOA для метода создания и обновления вызывается дважды, поэтому я дважды получаю одни и те же записи в своем пользовательском расширении хранилища.

  • Методы создания/обновления вызываются дважды - когда я публикую любую страницу, две записи для каждой сохраняются в базе данных.
  • Удалить (отмена публикации страницы в порядке, в базу данных вставляется только одна запись, однако после отмены публикации любой страницы в следующий раз публикация для этой конкретной страницы не будет выполнена)

У меня есть приведенный ниже код класса для обработки страницы, и такой же код написан для компонента и двоичных файлов:

package com.tridion.storage.dao;

import java.io.File;

import com.tridion.broker.StorageException;
import com.tridion.data.CharacterData;

import com.tridion.storage.PageMeta;
import com.tridion.storage.StorageManagerFactory;
import com.tridion.storage.StorageTypeMapping;
import com.tridion.storage.filesystem.FSEntityManager;
import com.tridion.storage.filesystem.FSPageDAO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FSPageContentDAOExtension extends FSPageDAO implements PageDAO 
{
    private static Logger log = LoggerFactory.getLogger(FSPageContentDAOExtension.class);

    public FSPageContentDAOExtension(String storageId, String storageName, File storageLocation) 
    {
        super(storageId, storageName, storageLocation);     
        log.debug("Entering Constructor 1: FSPageContentDAOExtension(" + storageId + ","  + storageLocation.getPath() + ","  + storageName + ")");
    }

    public FSPageContentDAOExtension(String storageId, String storageName, File storageLocation, FSEntityManager entityManager) {
        super(storageId, storageName, storageLocation, entityManager);
        log.debug("Entering Constructor 2: FSPageContentDAOExtension(" + storageId + "," + entityManager.toString() +  ","  + storageLocation.getPath() + ","  + storageName + ")");
    }


    public void create(CharacterData page, String relativepath) throws StorageException 
    {
        super.create(page,relativepath);    

        log.info("Inside the Create");
        log.info("storageId.toLowerCase()-"+storageId.toLowerCase());

        try
        {
                log.info("Inside the Create - page.getPublicationId():"+page.getPublicationId()+"--"+relativepath);
                ItemDAO item = (ItemDAO) StorageManagerFactory.getDAO(page.getPublicationId(),StorageTypeMapping.PAGE_META);
                log.info("Inside the Create - item:"+item.getBindingName());
                if( item !=null)
                {     
                    log.info("Inside the Create - PageMeta:");
                    PageMeta pageMeta = (PageMeta) item.findByPrimaryKey(page.getPublicationId(),page.getId());
                    log.info("Inside the Create - PageMeta2:"+pageMeta.getFileName());
                    if(pageMeta!=null)
                    {
                        log.info("Create - PageMeta-"+pageMeta.getTitle());
                        int publicationId = pageMeta.getPublicationId();
                        String strIgnorePubIds = "232,481";
                        String pubId = Integer.toString(publicationId);
                        if(!strIgnorePubIds.contains(pubId))
                        {
                            String url = pageMeta.getUrl();
                            String tcmURI = Integer.toString(pageMeta.getItemId());
                            PublishActionDAO publishActionDAO = (PublishActionDAO) StorageManagerFactory.getDefaultDAO("PublishAction");
                            if(publishActionDAO !=null)
                            {
                                PublishAction publishAction = new PublishAction();          
                                publishAction.setAction("ADD");
                                publishAction.setPublicationID(publicationId);
                                publishAction.setUrl(url);
                                publishAction.setLastPublishedDate(pageMeta.getLastPublishDate());
                                publishAction.setItemType(64);
                                publishAction.setTcmUri(tcmURI);
                                log.debug("Going to Store bean -"+ publishAction.toString());
                                publishActionDAO.store(publishAction);
                                createFlag = false;
                            }

                        } 
                    }
                }           
        }
        catch (StorageException se) 
        {           
            log.error("FSPageContentDAOExtension - Exception occurred " + se);
        }
    }

    public void update(CharacterData page,String originalRelativePath, String newRelativepath)throws StorageException {
        super.update(page,originalRelativePath,newRelativepath);;   
        log.info("Inside the Update");
        log.info("storageId.toLowerCase()-"+storageId);

        try
        {

                log.info("Inside the Update - page.getPublicationId():"+page.getPublicationId()+"--"+originalRelativePath+"--"+newRelativepath);
                ItemDAO item = (ItemDAO) StorageManagerFactory.getDAO(page.getPublicationId(),StorageTypeMapping.PAGE_META);
                log.info("Inside the Update - item:"+item.getBindingName());
                if( item !=null)
                {     
                    log.info("Inside the Update - PageMeta:");
                    PageMeta pageMeta = (PageMeta) item.findByPrimaryKey(page.getPublicationId(),page.getId());
                    log.info("Inside the Update - PageMeta2:"+pageMeta.getFileName());
                    if(pageMeta!=null)
                    {
                        log.info("Update - PageMeta-"+pageMeta.getTitle());
                        int publicationId = pageMeta.getPublicationId();
                        String strIgnorePubIds = "232,481";
                        String pubId = Integer.toString(publicationId);
                        if(!strIgnorePubIds.contains(pubId))
                        {
                            String url = pageMeta.getUrl();
                            String tcmURI = Integer.toString(pageMeta.getItemId());
                            PublishActionDAO publishActionDAO = (PublishActionDAO) StorageManagerFactory.getDefaultDAO("PublishAction");
                            if(publishActionDAO !=null)
                            {
                                PublishAction publishAction = new PublishAction();          
                                publishAction.setAction("UPD");
                                publishAction.setUrl(url);
                                publishAction.setPublicationID(publicationId);
                                publishAction.setLastPublishedDate(pageMeta.getLastPublishDate());
                                publishAction.setItemType(64);
                                publishAction.setTcmUri(tcmURI);
                                log.debug("Going to Store bean -"+ publishAction.toString());
                                publishActionDAO.store(publishAction);
                                createFlag = false;
                            }                       
                        } 
                    }
                }
        }
        catch (StorageException se) 
        {           
            log.error("FSPageContentDAOExtension - Exception occurred " + se);
        }

    }

    public void remove(final int publicationId, final int pageID, final String relativePath) throws StorageException {

        log.info("Inside the Delete");      
        try
        {

                ItemDAO item = (ItemDAO) StorageManagerFactory.getDAO(publicationId,StorageTypeMapping.PAGE_META);
                if( item !=null)
                {       
                    PageMeta pageMeta = (PageMeta) item.findByPrimaryKey(publicationId,pageID);

                    if(pageMeta!=null)
                    {
                        log.info("Delete - PageMeta-"+pageMeta.getTitle());                 
                        String strIgnorePubIds = "232,481";
                        String pubId = Integer.toString(publicationId);
                        if(!strIgnorePubIds.contains(pubId))
                        {
                            String url = pageMeta.getUrl();
                            String tcmURI = Integer.toString(pageMeta.getItemId());
                            PublishActionDAO publishActionDAO = (PublishActionDAO) StorageManagerFactory.getDefaultDAO("PublishAction");
                            if(publishActionDAO !=null)
                            {
                                PublishAction publishAction = new PublishAction();          
                                publishAction.setAction("DEL");
                                publishAction.setUrl(url);
                                publishAction.setLastPublishedDate(pageMeta.getLastPublishDate());
                                publishAction.setItemType(64);
                                publishAction.setTcmUri(tcmURI);
                                publishAction.setPublicationID(publicationId);
                                log.debug("Going to Store bean -"+ publishAction.toString());
                                publishActionDAO.store(publishAction);
                            }

                        } 
                    }
                }           
        }
        catch (StorageException se) 
        {           
            log.error("FSPageContentDAOExtension - Exception occurred " + se);
        }
        super.remove(publicationId, pageID, relativePath);  
    }
}

мой пакет хранилища, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<StorageDAOBundles>
    <StorageDAOBundle type="persistence">
        <StorageDAO typeMapping="PublishAction" class="com.tridion.storage.dao.JPAPublishActionDAO" />
    </StorageDAOBundle>

    <StorageDAOBundle type="filesystem">
    <StorageDAO typeMapping="Binary" class="com.tridion.storage.dao.FSBinaryContentDAOExtension" />
    </StorageDAOBundle>

    <StorageDAOBundle type="filesystem">
        <StorageDAO typeMapping="Page" class="com.tridion.storage.dao.FSPageContentDAOExtension" />
    </StorageDAOBundle>

    <StorageDAOBundle type="filesystem">
        <StorageDAO typeMapping="ComponentPresentation" class="com.tridion.storage.dao.FSComponentContentDAOExtension" />
    </StorageDAOBundle>
</StorageDAOBundles>

Мой пример cd_storage XML

<Storages>
    <StorageBindings>
        <Bundle src="search_dao_bundle.xml"/>
    </StorageBindings>  
    <Storage Type="persistence" Id="searchdb" dialect="MSSQL" Class="com.tridion.storage.persistence.JPADAOFactory">
        <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120" />
        <DataSource Class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
            <Property Name="serverName" Value="*****" />
            <!--Property Name="portNumber" Value="1433" /-->
            <Property Name="databaseName" Value="**********" />
            <Property Name="user" Value="*****" />
            <Property Name="password" Value="********" />
        </DataSource>
    </Storage>

    <Storage Type="filesystem" Class="com.tridion.storage.filesystem.FSDAOFactory" Id="defaultFile" defaultFilesystem="false">
        <Root Path="F:\test.com New" />
    </Storage>
    <Storage Type="filesystem" Class="com.tridion.storage.filesystem.FSDAOFactory" Id="defaultDataFile" defaultFilesystem="true" defaultStorage="true">
        <Root Path="F:\test.com New\data" />
    </Storage>  
</Storages>
<ItemTypes defaultStorageId="defaultdb" cached="false"> 
        <Item typeMapping="PublishAction" cached="false" storageId="searchdb" />    
        <Item typeMapping="Query" storageId="defaultdb"/>
        <Item typeMapping="SearchFilter" storageId="defaultDataFile"/>
        <Item typeMapping="XSLT" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="ComponentPresentation" itemExtension=".Jsp" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="ComponentPresentation" itemExtension=".Asp" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="ComponentPresentation" itemExtension=".Xml" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="ComponentPresentation" itemExtension=".txt" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="Schema" cached="false" storageId="defaultDataFile"/>
        <Item typeMapping="Page" cached="false" storageId="defaultFile"/>
        <Item typeMapping="Binary" cached="false" storageId="defaultFile"/>
</ItemTypes>    

person Manoj Singh    schedule 14.01.2013    source источник
comment
Может ли быть так, что метод обновления в суперклассе реализован как комбинация удаления и создания?   -  person Quirijn    schedule 14.01.2013
comment
@Quirijn, спасибо, о каком суперклассе вы говорите, поскольку я не вижу никакой реализации в классе FSPageDAO и интерфейсе PageDAO, ну, если вы видите, я просто расширяю его, однако мой PublishActionDAO также вызывает super.create   -  person Manoj Singh    schedule 14.01.2013
comment
Всем привет. Вы упомянули, что ваш код вызывается дважды. Знаете ли вы, происходят ли звонки рядом или между ними происходит множество других вещей? Вполне возможно, что в вашем случае Tridion Deployer дважды записывает страницу, чтобы гарантировать целостность вашего репозитория.   -  person Daniel Neagu    schedule 15.01.2013


Ответы (1)


Причина, по которой две записи были вставлены в мою пользовательскую таблицу, заключалась в том, что у нас есть два пользовательских расширения PAGE Deployer, реализованных на нашем сервере презентаций.

Итак, и развертыватель вызывает базовый класс FSPageDAO, и методы интерфейса PageDAO.

Вышеупомянутая проблема может быть решена, только если у нас есть код для обработки ограничения на вызов базовых классов в нашем DAO.

В противном случае это невозможно контролировать, если на сервере реализовано расширение развертывания.

Пожалуйста, предложите, если мы можем проверить и контролировать в нашем DAO (если это возможно).

Спасибо.

person Manoj Singh    schedule 15.01.2013
comment
О каком расширении развертывания вы говорите? Пользовательский модуль развертывания? Или процессор? Или что-то другое? - person Quirijn; 16.01.2013
comment
Привет, Quirijin, это настраиваемый модуль развертывания. - person Manoj Singh; 16.01.2013
comment
Не могли бы вы переписать пользовательские модули так, чтобы дао страницы вызывалось только один раз? Кроме того, если это не сработает, не можете ли вы сделать страницу dao достаточно умной, чтобы распознавать обновления и правильно их обрабатывать? - person Quirijn; 16.01.2013