2

由于某些原因,我需要自定义部署器,我只能看到一些使用 java 自定义部署器的文章。

我们可以使用 .NET 项目自定义部署程序吗,请分享您的想法,如果可能的话,请分享一些解决方案。

4

2 回答 2

5

显而易见的答案是NO。Deployer 是 Content Delivery 的一个相当低级的部分,它的扩展点仅对 Java 可用。

但是,有很多方法可以给这只猫剥皮,这完全取决于您要达到的目标。

例如,您可以使用 .NET 创建一个 Web 服务来完成扩展的所有功能,并编写一个简单的部署模块(使用 Java)来调用该 Web 服务,并将所有必需的参数传递给它。

您可以通过在将包传递到部署程序正在侦听的实际位置之前发布到调用 .NET 方法的位置来预处理传输包。

如果您更喜欢后处理,您可以配置部署程序以保持成功的事务并监控部署程序存储这些事务的位置(“传入文件夹”+“\Success”)。

这实际上完全取决于您想要实现的目标。推荐的方法是使用 Java,但如果您不熟悉该语言,您可以发挥创造力并以最少的 Java 编码实现相同的最终结果。这是一个“空”模块的示例,它遍历正在发布的项目并记录有关对象的信息:

import java.util.Iterator;

import com.tridion.configuration.Configuration;
import com.tridion.configuration.ConfigurationException;
import com.tridion.deployer.Module;
import com.tridion.deployer.ProcessingException;
import com.tridion.deployer.Processor;

import com.tridion.transport.transportpackage.Binary;
import com.tridion.transport.transportpackage.BinaryKey;
import com.tridion.transport.transportpackage.Component;
import com.tridion.transport.transportpackage.ComponentKey;
import com.tridion.transport.transportpackage.MetaData;
import com.tridion.transport.transportpackage.MetaDataFile;
import com.tridion.transport.transportpackage.Page;
import com.tridion.transport.transportpackage.PageKey;
import com.tridion.transport.transportpackage.ProcessorInstructions;
import com.tridion.transport.transportpackage.Section;
import com.tridion.transport.transportpackage.TransportPackage;

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


public class CustomCacheNotificationDeploy extends Module {

    String action = null;
    Logger log = null;
    MetaDataFile pageMeta = null;
    MetaDataFile componentMeta = null;
    MetaDataFile binaryMeta = null;
    public CustomCacheNotificationDeploy(Configuration config, Processor processor)
            throws ConfigurationException {
        super(config, processor);
        log = LoggerFactory.getLogger(getClass());
        // TODO Auto-generated constructor stub
    }

    @SuppressWarnings("deprecation")
    public void process(TransportPackage data) throws ProcessingException{
        ProcessorInstructions instructions = data.getProcessorInstructions();
        action = instructions.getAction();
        MetaData pageMetaInfo = instructions.getMetaData("Pages");
        MetaData componentMetaInfo = instructions.getMetaData("Components");
        MetaData binaryMetaInfo = instructions.getMetaData("Binaries");
        pageMeta = data.getMetaData("Pages", pageMetaInfo.getName());
        componentMeta = data.getMetaData("Components", componentMetaInfo.getName());
        binaryMeta = data.getMetaData("Binaries", binaryMetaInfo.getName());

        log.debug("Action " + action + " started for publication " + instructions.getPublicationId());

        Section section = null;
        Iterator<Section> Sections = instructions.getSections();
        for(; Sections.hasNext(); processSection(section))
        {
            section = Sections.next();
        }

    }

    protected void processSection(Section section)
    {
        log.debug("Processing Section " + section.getName());
        Iterator iterator = section.getFileItems();
        Object item;
        for(; iterator.hasNext(); processItem(item, section))
        {
            item = iterator.next();
        }
        Section subSection;
        for(Iterator i$ = section.getSubSections().iterator(); i$.hasNext(); processSection(subSection))
            subSection = (Section)i$.next();
    }

    protected void processItem(Object obj, Section section)
    {
        if(obj instanceof PageKey)
        {
            log.debug("Object is Page");
            PageKey key = (PageKey) obj;
            Page page = (Page)pageMeta.getMetaData(key);
            log.debug("Page being deployed is " + page.getId() + " with URL " + page.getURLPath());
        }
        if(obj instanceof ComponentKey)
        {
            log.debug("Object is Component");
            ComponentKey key = (ComponentKey) obj;
            Component component = (Component)componentMeta.getMetaData(key);
            log.debug("Component being deployed is " + component.getId());
        }
        if(obj instanceof BinaryKey)
        {
            log.debug("Object is Binary");
            BinaryKey key = (BinaryKey) obj;
            Binary binary = (Binary)binaryMeta.getMetaData(key);
            log.debug("Binary being deployed is " + binary.getId() + " with URL " + binary.getURLPath());
        }
    }
}
于 2012-05-20T14:14:52.937 回答
5

如您所见,部署程序只能使用 Java 进行扩展。如果您想使用 .NET 进行完全自定义的操作,最好的选择是使用 FTP(或没有进程内部署程序的 HTTP)发布文件,并创建一个带有文件系统监视器的 .NET 应用程序来处理文件。

也许您可以分享更多关于您想要实现的目标以及您的 SDL Tridion 版本,以便有人提供更多建议。

于 2012-05-20T10:29:36.317 回答