我对atg水滴,dsp标签和编写自定义水滴有一些了解。我想知道关于ATG主题的管道。当我试图引用oracle文档时,我对理解它是什么以及它的工作流程感到有点困惑。我可以创建一个自定义管道管理器,按顺序执行我的自定义处理器。如果可能,我该怎么做?如何从我的jsp页面触发我的管道管理器。请引导我一些教程或在线文档,以便最好地学习管道。
代码片段非常受欢迎。
提前致谢
答案 0 :(得分:5)
管道是一种允许模块化代码执行的执行机制。 Oracle ATG Web Commerce使用管道执行加载,保存和签出订单等任务.TipelineManager实现了管道执行机制。
Dynamo使用了两个请求处理管道。
•DAF Servlet Pipeline - 用于处理JSP请求。
•DAS Servlet管道 - 用于处理JHTML请求。因为JHTML是一种专有语言,所以它依赖于DAS servlet管道中提供的页面编译器来生成JHTML到应用服务器呈现为HTML的servlet中。
还有一种叫做commercePipeline的东西负责订单处理。
请求处理管道和商业管道以不同的方式工作。
DAS / DAF(即请求管道)
它是根据每个servlet的输出按顺序执行的一系列servlet定义的配置。 Dynamo最重要的任务之一是处理HTTP请求。在处理这些请求时,Dynamo使用会话跟踪,页面编译,Java Server Pages以及基本Web服务器模型的其他强大扩展。请求处理通常可以分解为一系列独立的步骤。每个步骤可能取决于有关请求的其他可用信息,因此顺序很重要。但是,各个步骤是可分离的。例如,典型的请求可能会执行以下步骤:
1)将请求URI与受限目录列表进行比较,以确保用户有权访问指定目录。
2)将请求URI转换为真实的文件名,并使用" index"文件名引用目录时考虑文件。
3)给定文件名的扩展名,确定文件的MIME类型。
4)从MIME类型,将请求分派给适当的处理程序。
当有请求时,DAF / DAS流水线就会出现。在atg_bootstrap.war中,web.xml包含有关服务器启动的信息。
当服务器启动时,NucleusServlet.java会在应用服务器中加载。这个类初始化nucleus和其他组件,然后将它们全部添加到nucleus命名空间。当访问Web应用程序(DynAdmin,CRS,MotopriseJSP)时,nucleus将流路由到daf / das管道。如果应用程序MIME类型是Jhtml,则das管道会进一步处理该请求。它被路由到DynamoProxyServlet类,通过调用servlet列表进行进一步处理。如果它是.jsp,那么Daf管道通过调用PageFilter类来处理进一步的请求。使用过滤器而不是servlet来调用DAF管道的原因是:
JSP页面和片段由应用程序服务器处理,这意味着JBoss,WebLogic,WebSphere是负责编译和执行结果页面代码的人。挂钩此过程的最佳方法是使用过滤器。对于JHTML页面,这是一个不同的故事,因为应用服务器(并非所有应用服务器)都无法解析和编译页面。 servlet用于将请求重定向到DAS管道,其中页面可以由ATG页面编译机制解析和执行。
如果使用Commerce Pipeline:
Pipeline Manager通过读取管道定义文件即commercepipeline.xml来实现商业管道功能。部署应用程序时,Nucleus初始化定价引擎,OrderManager初始化pipelineManager。 OrderManager.processOrder方法调用commercepipeline.xm中的管道链。管道链将具有处理器,这些处理器是执行小操作的简单Java类。可以通过添加自定义处理器来扩展此xml。但是在需要调用单个处理器的情况下,通过传递processorchaninId来调用pipelineManger的runProcess方法。
扩展DAF / DAS管道和商业管道不一样
我们可以创建自己的自定义servlet以将其放入DAF / DAS管道中。
使用 PipelineableServletImpl 或 InsertableServletImpl 扩展您自己的servlet类枯萎 并根据您的要求重新编写服务方法。更多详细信息可在互联网上广泛获得:)
来到商业管道
Commerce管道在位于/B2CCommerce/config/atg/commerce/commercepipeline.xml中的xml文件中定义.PipeLine管理器负责加载管道定义xml并初始化管道链。编写处理器类。 Custom Processor类应该是PipelineProcessor的实现。
通过 PipelineProcessor 扩展您自己的类并重新编写runProcess方法。您还必须为您的处理器创建相应的.properties文件。然后在
中<强> B2CCommerce /配置/ ATG /商业/ commercepipeline.xml 强>
<pipelinechain name=" lastExistingchain" transaction="TX_REQUIRED" headlink=" lastExistinglink">
……..
<transition returnvalue="1" link=" sampleDemoLink"/>
</pipelinelink>
<pipelinelink name="sampleDemoLink" transaction="TX_REQUIRED">
<processor jndi="demo/atg/order/processor/MyProcessor"/>
</pipelinelink>
</pipelinechain>
重启ATG服务器。
如果我们可以创建自己的管道管理器,请告诉您其他问题 答案是肯定的。 只需在本地配置文件夹中创建/ atg / registry / PipelineRegistry / .properties文件.PipelineRegistry是一个所有管道管理器都已注册的服务
此服务具有名为pipelineManagers的属性,只需将管道管理器组件附加到此属性。如果要使用现有的commercePipelineManager类,但使用不同的处理器串执行另一个。另外创建一个类似于此的定义xml文件< / p>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE pipelinemanager
PUBLIC "-//Art Technology Group, Inc.//DTD Dynamo Pipeline Manager//EN"
'http://www.atg.com/dtds/pipelinemanager/pipelinemanager_1.0.dtd'>
<pipelinemanager>
<!-- This chain updates (saves) an Order to the repository -->
<pipelinechain name="updateOrder" transaction="TX_REQUIRED" headlink="updateOrderObject">
<pipelinelink name="updateOrderObject" transaction="TX_MANDATORY">
<processor jndi="/atg/commerce/order/processor/SaveOrderObject"/>
<transition returnvalue="1" link="updateCommerceItemObjects"/>
</pipelinelink>
<pipelinelink name="updateCommerceItemObjects" transaction="TX_MANDATORY">
<processor jndi="/atg/commerce/order/processor/SaveCommerceItemObjects"/>
<transition returnvalue="1" link="updateShippingGroupObjects"/>
</pipelinelink>
<pipelinelink name="updateShippingGroupObjects" transaction="TX_MANDATORY">
<processor jndi="/atg/commerce/order/processor/SaveShippingGroupObjects"/>
<transition returnvalue="1" link="updateHandlingInstructionObjects"/>
</pipelinelink>
<pipelinelink name="updateHandlingInstructionObjects" transaction="TX_MANDATORY">
.......
.......
<pipelinechain name="rejectQuote" transaction="TX_REQUIRED" headlink="quoteRejection">
<pipelinelink name="quoteRejection" transaction="TX_MANDATORY">
<processor jndi="/atg/commerce/order/processor/RejectQuote"/>
</pipelinelink>
</pipelinechain>
<!-- This pipeline chain should be called when a requested quote is to be completed -->
<pipelinechain name="completeQuote" transaction="TX_REQUIRED" headlink="completeQuoteRequest">
<pipelinelink name="completeQuoteRequest" transaction="TX_MANDATORY">
<!-- this is a dummy processor that should be extended to save quote details -->
<processor jndi="/atg/commerce/order/processor/CompleteQuoteRequest"/>
</pipelinelink>
</pipelinechain>
</pipelinemanager>
在这里你可以提到自定义处理器。
由于您已在管道注册表中注册了新的管道管理器。它会自动初始化。因此,如果您在与管道相关的JSP中执行任何操作,则在后台完成所有处理。
答案 1 :(得分:1)
ATG中有两个完全独立的东西,通常称为管道。
它们完全没有关系。
<强> 1。 Servlet管道
这是一个servlet链,在命中自定义代码(JSP页面,Form Handler,Droplet或其他任何代码)之前,所有请求都会通过这些servlet链接。此管道的目的是修饰传入请求,以便为请求提供ATG框架所需的上下文,例如,将请求与Dynamo会话相关联并加载用户配置文件。 DAS模块定义了基本的servlet管道,各种模块在其中添加了额外的servlet。
您可以通过更改现有组件的nextServlet
或相关属性,以及创建Nucleus组件来修改此管道,这些组件是从PipelineableServlet
扩展的类的实例
如果您想对每个传入请求执行操作或做出决定,您可以选择自定义此方法 - 有点类似于在标准J2EE Web应用程序中使用Filters或在Spring MVC应用程序中使用Intercept的方法。
通过查看Dynamo Admin界面中的/atg/dynamo/servlet/dafpipeline/DynamoHandler
组件,您可以查看servlet管道中定义的内容。
<强> 2。处理器链
处理器链是一种执行谨慎流程并根据每个流程的结果(结果状态代码)将它们链接在一起的方法。 Nucleus中有一个名为Pipeline Manager的组件,它保存系统中定义的每个Processor Chain的配置,并管理这些链的执行。
Commerce模块使用处理器链来管理(例如)创建订单以确保所有组成部分之间的参照完整性。这有时称为商业管道。
处理器链在概念上与场景更相关,与servlet管道完全无关。
您可以通过创建或编辑定义链的XML文件来修改处理器链。您可以通过从实现PipelineProcessor接口的类创建Nucleus组件来创建新的处理器。
您可以通过查看Dynamo管理界面中的PipelineManager
组件来查看定义了哪些链。 ACC中还有一个图形化的管道编辑器。
如果要在其中添加或删除步骤,则可以修改现有管道链。
如果您希望将一个漫长而复杂的流程(通常是存储库操作)拆分为多个不连续的步骤,以便通过外部化流程对这些流程进行排序,那么您将创建一个新的链。