Siebel 集成中的“发布-订阅”与“阅读”

作者:Graham Nicol

将 Siebel 应用程序中存储的数据提供给企业中的其他应用程序时,通常需要遵循以下两种基本模式之一:

  1. 发布-订阅
  2. 阅读


“发布-订阅”是一种机制,根据该机制,一个系统(发布者)将更改或更新的数据提供给其他系统;其他系统(订阅者)注册以示它们希望接收数据更改以及数据事件的通知。

“阅读”机制实际是大量其他模式(如事件驱动的客户、点对点、选择性客户、事务客户端等)的混合。任何符合“使用者请求数据,提供者发送数据”这一原则的模式都可视为该超集的一部分。与“阅读-发布”模式不同,“阅读”模式不需要使用某种中间件(或者在 Siebel 应用程序中进行大量编码),因此该模式无疑可被视为点对点模式。

这两种模式都具有自己的优点和缺点,都具有自己关于特定集成以及整个企业集成基础架构的需要和假设。Siebel(或任何其他应用程序)的需要和约束通常会与融合中间件平台截然不同,有时可能是对一方直观而对另一方不直观。

发布-订阅

“发布-订阅”模式的基本概念是,订阅者接收数据集 更新,这暗示每个订阅者必须拥有一份要使用的数据的副本。因此,如果使用“发布-订阅”模式的企业有 n 个订阅者,就会有 n 个记录。

对于小型数据集,该数量不会过大;但是对于大型数据集,例如销售报价或订单,该数量很快就会影响整个企业的容量规划。

“发布-订阅”模型另一个要考虑的问题是主数据问题,即“您对复制的数据有多信任?”,或许应该是“ Blade Runner”问题!如果使用“发布-订阅”模式的企业有多个数据副本,那么每个系统从哪里获取数据?当然,正确答案是从中间件以及数据的主系统获取,但是如果下游系统直接访问众多副本中的一个,会发生什么情况呢?如果访问的副本并不是最新数据副本,会发生什么情况? ,太可怕了。因此,如果需要事务数据,使用“发布-订阅”模式需要慎重考虑。

那么,从应用程序的角度来看,“发布-订阅”模式的优点是什么?对于易变性相对较低的参考数据集(例如,“联系人”或“帐户”),使用“订阅-发布”模式可以很好地将数据复制到下游系统,以允许它们使用数据集并以“接近实时”的方式进行更新(我只是喜欢“接近实时”这种表达,事物或者是实时的,或者不是实时的……“接近”毫无意义)!

阅读

“阅读”模式和“发布-订阅”模式最基本的差异是效率。假设某个帐户以“发布-订阅”模式进行了更新并且该更改将传送到 10 个下游系统,则将从 Siebel 传递一个消息到中间件,然后再传出 10 个消息,分别到达各个订阅系统。使用“阅读”模式时,如果这 10 个下游系统需要访问该帐户,则 每次请求该数据时 都需要总共 40 个消息。

“阅读”模式的数据传输“低效性”是集成架构师更喜欢采用“发布-订阅”模式的首要原因。但是有些情况下,确实需要使用“阅读”模式。“发布-订阅”模式出现问题时就需要“阅读”模式大显身手了,如以下情况:不需要复制数据,否定整个企业的数据完整性问题,以及避免整个订阅系统的容量“复杂化”。对于易变性较高的事务数据,“阅读”模式通常是不错的选择。

因此,总的来说,没有任何一种方法是执行集成的“正确”方法,每个客户情况都不一样,在各个阶段,都需要慎重考虑技术和组织双方面的驱动因素,然后再给出一致的策略。我个人认为,应该始终对采取决策所涉及的相关事项加以试验和考虑,因为孤立地进行 Siebel 集成甚至 Oracle 部署的时代已经过去了。

深入阅读

企业集成模式(美国)

企业集成模式(英国)

作者:Gregor Hohpe、Bobby Woolf



使用 OWSM 保护 Siebel Web 服务

作者:Ken Fiedler、Nathan Ritter


图 1

我们发现了一个业务需求,即为客户和员工创建一个不同于架构师的简单门户界面,因为这样有助于提升 Oracle 支持系统的技术水平。我们选择针对这个项目使用最新的面向服务的体系结构 (SOA) 和融合中间件,因为这样可以控制对可能驻留在各个不同系统中的公司和客户敏感数据的访问。

在该网志中,我们将介绍使用 Oracle Web 服务管理器 (OWSM) 以及 Oracle 的一次性登录和 LDAP 服务器保护 Siebel web 服务,以控制 ADF 应用程序对 Siebel web 服务的访问所需的步骤。

我们将实施上面图 1 所示的情形。用户身份验证全部通过 Oracle 的 SSO 服务器进行,并由 Oracle 的 Internet Directory (OID)/LDAP 服务器中存储的责任控制。OWSM 将使用应用程序 OID 的访问控制列表 (ACL) 中存储的责任来判定用户是否得到授权可以运行 Siebel 的 EAI/自定义应用程序对象管理器提供的 web 服务。

在本网志后面部分,我们将介绍用于存储责任的 LDAP 结构以及帐户。我们还将介绍如何设置 Siebel 信任令牌以处理访问管理器登录会话的应用程序验证,讨论如何使用安全适配器针对 LDAP 进行 web 服务的用户身份验证。然后,还将讨论针对 LDAP 结构授权所需的 SOAP 头结构和 OWSM 网关策略配置。最后,我们还将介绍一些使用该安全模型从 ADF 调用 Siebel web 服务的示例。



Siebel 导入 WSDL 工具不理解 BPEL 生成的 WSDL

作者:Nishit Rao、Markus Zirn

为什么需要知道这一点?如果您希望通过 Siebel 工作流调用外部 web 服务(如 BPEL 流程),通常需要执行的一个步骤是为端点(本例为 BPEL 流程)生成一个 WSDL,并通过 Siebel 导入 WSDL 工具在 Siebel 工具中使用它。如果该 WSDL 是由 BPEL 自动生成的,您就会遇到我们所说的小麻烦。

让我们来做具体的说明。为什么需要首先集成 Siebel 工作流和 BPEL?Siebel 工作流不负责业务流程吗?工作流是 Siebel 中的业务组件,适合在 Siebel 中作处理工作。但是,如果您的业务流程跨 Siebel 和其他应用程序,BPEL 等基于标准的业务流程引擎则是最适合的(广告到此结束)。

回头说我们的小麻烦(记住,Siebel 导入 WSDL 工具不理解 BPEL 生成的 WSDL)。为了让问题尽快出现,让我们继续“销售订单”的集成,在同步交互操作中使用 HTTP 上的 SOAP。我知道,关于从 Siebel 到外部系统的出站 web 服务集成,有很多其他体系结构主题,例如识别数据结构、集成基元(同步、异步、单向)、传输(http、jms、文件)等等。但是,这些我们以后再讨论……

在出现我们所说的小麻烦之前,我们要按常规的顺序操作 — 请忍耐一下,执行以下操作:将订单标识为数据后,实施该出站 web 服务集成的第一步是使用 Siebel 的模式生成向导(Siebel 工具的一部分)来生成订单 XML 消息类型(注意,此处我们选择了一个现有的订单集成对象,而不是创建一个新的集成对象)。选择 XSD Schema Generator 和 No Envelope 选项后,您应该拥有一个类似该 ListOfOrder.xsd 的 ListOrOrder。

上面的工作做完后,我们将创建出站 Siebel 服务将调用的 BPEL 流程 — 选择同步流程选项,并将 ListOfOrder.xsd 设置为流程的输入和输出。您可能已经选择了不同的输入和输出元素,但是从现在起让我们使用简单的方法。

现在,保存 BPEL 流程、部署该流程并获得它的 WSDL。以下是一个示例 SiebelOrderProcess.wsdl。请记住:默认情况下,每个 BPEL 流程都 一个 web 服务,有一个自动生成的 WSDL。

剩下的就很简单了,比如您可以:就在 Siebel 工具中使用这个自动生成的 WSDL。此时,就会遇到我们所说的小麻烦:很不幸,Siebel 导入 WSDL 工具不喜欢 BPEL 自动生成的 WSDL 中包括的“导入”语句。

好消息是修复工作相对容易一些:将导入语句替换为内嵌消息类型,所下所示。

您所要做的是打开 ListOfOrders.xsd 文件,复制除模式定义第一行之外的所有内容。复制以 <?xml version="1.0". 开头的行之后的所有内容。将全部模式定义粘贴到 <types></types> 之间。此时,您的导入已经完成。我们的小麻烦得到了修复!

一旦导入,BPEL WSDL 将在其他产物之间生成一个 Siebel web 服务代理(实际上是一个业务服务)以调用 BPEL 流程。将该代理绑定到内部 Siebel 组件(如 Applet 事件、工作流等)后,订单信息就会按预期方式发送到 BPEL。

迫不及待地想了解更多详细信息?我们很快就会推出针对此类出站集成的完整端到端教程。敬请关注。



开发从 Siebel OnDemand 到 Siebel OnPremise 的接口

作者:Bram Hoebeke

在最近与客户的合作中,有人要求我设计并开发一个从 Siebel OnDemand 到 Siebel 7.8 的接口。他们还建议开发 Siebel EIM(企业集成管理器 — 一种批量数据传输工具),因为它的开发简单、快速,并能提供一个稳定的解决方案。这样,在初始负载以及批量模式和调用时应该都能正常运转。

首先,需要传输的数据是帐户数据以及所有相关的子对象(联系人、地址、帐户关系等)。再清楚不过了!直到他们发现还需要“有效客户”。现在,将帐户数据从 OnDemand 映射到 OnPremise 似乎相当简单。但是,有效客户怎么办呢?应该传输到无保留客户、潜在客户或许是列表?

EIM 很适合传输批量负载,在这种情况下,数据模型相当简单。但是创建一个这样的自动化流程是行不通的:提取 OnDemand 中的数据、验证数据、扩展数据并将数据载入 EIM 表,然后启动 EIM 作业(他们希望分析、设计和实施能够在大约 15 天内完成,我提到了吗?)。但是此处使用 web 服务的主要原因是对象模型。OnDemand 和 OnPremise 的逻辑层几乎是完全相同的。

Siebel OnDemand 可为您使用的所有数据实体提供 Web 服务。(甚至自定义对象)和 Siebel OnPremise 提供了一整套工具来使用这些 web 服务、传输数据、将数据映射到集成组件并提交数据。所有这些操作都通过一种安全的、灵活的方式进行。由于 OnDemand Web 服务具有相同的“布局”,因此它们尤其适用于构建可重用的、透明的接口。由于非常适合以批量模式运行,因此映射更改可以在正式推出之后进行,而且所需的自定义也最少。

在接下来的网志中,我将逐步介绍如何创建这样的解决方案,以及为此所使用的 EAI 业务服务和其他对象。



使用 Siebel 组合同步和异步 BPEL 流程

作者:Santosh Malik

与 Oracle BPEL 流程管理器不同,Siebel 不支持异步 web 服务交互操作。针对运行时间较长的 BPEL 流程使用同步交互操作可能会出现问题(有时可能需要几天的时间才能同步),而且加载的不仅是 BPEL 还有 Siebel 对象管理器。在本网志中,我们将介绍如何模拟 Siebel 和 Oracle BPEL 流程管理器之间的异步交互操作。

解决方案是创建两个 BPEL 流程。这是一个两步集成:一个流程接收 Siebel 有效载荷并返回收到确认。另一个流程在 Siebel 中完成处理并更新状态。在我们的解决方案中,我们将有效载荷发送到订单接收流程 (ORP)。这里我们所要做的只是将状态更新为“Submitted”,并返回确认。在 Siebel 中,订单状态已经更新。同时,订单接收流程调用 BPEL 订单登记流程,这是一个异步调用。最后,当订单登记流程完成后,会调用 Siebel 中的一个入站 web 服务,然后将状态更新为“Complete”。

哪些活动在第一个流程中执行,哪些活动留在第二个流程中执行,这是体系结构的选择。我们不希望 Siebel Call Center 应用程序等待最终响应。在接收流程中执行的常见任务是订单验证以及任何可选的规范传输。一旦确定收到一个有效订单,我们就可以向 Siebel 返回响应。以下是一个示例 SiebelOrderReceivingProcess.wsdl。所有复杂的处理都在辅助 BPEL 流程中慢慢完成。在图 1 中,您可以看到,辅助 BPEL 流程被设置为一个外部 web 服务或主 BPEL 流程中的一个合作伙伴链接。该合作伙伴链接可以是一个纯粹的 web 服务、BPEL 流程或 ESB 服务。合作伙伴链接是使用为目标服务提供的 wsdl 建立的。 OrderBookingProcess.wsdl 是使用合作伙伴链接调用的一个示例 BPEL 流程。实现这种分离可以减少主 BPEL 流程中的一些比较耗时的处理,而将它们推送到辅助 BPEL 流程,从而使整体功能不受影响。

一旦我们可以调用辅助 BPEL 流程,就可以继续完成指定的任务。在本例中,我们可以执行一个数据库事务、调用一个外部 web 服务以及与人工流或其他 ESB 层进行交互。实现所需结果后,我们需要通知 Siebel 应用程序请求确实已经得到处理并完成。从图 2 中,您可以看到,使用 Siebel 入站 Web 服务在辅助 BPEL 流程(通常在末端)中执行了一个简单的 web 服务调用,并且状态已更新。我们可以在 Siebel 基础架构中设计自己的业务服务,也可以利用现有的服务。以下是一个示例 Siebel 入站 Web 服务 SiebelUpdateOrderWS.wsdl。这里的主要目标是完成同步调用启动的同步循环。

这不是请求-回复模式,因为没有自动相关性。BPEL 使用订单 ID 手动处理相关性。我们与 Siebel 和 BPEL 进行交互的唯一方式是使用订单 id。该机制是触发一个异步产物的同步调用。即使这里要注意该同步回调相当晚而不是即时的,但是无缝交互操作也会为我们提供同步的感觉。

总结一下就是,我们将一个复杂的流程拆分为两个子流程。主 BPEL 流程只处理确认部分并调用辅助 BPEL 流程。然后,该辅助 BPEL 流程会完成所需的任务,最后回调 Siebel 应用程序并提供最终的确认。



通过 BPEL 调用 Siebel OnDemand Web 服务

作者:Basheer Khan

使用 BPEL 调用 Siebel OnDemand Web 服务要求您传递一个通过发布包含用户名和口令的 URL 而返回的会话 ID。您可以通过在 BPEL 流程中使用嵌入 JAVA 来完成登录过程。在此之前,定义一个变量以存储在登录后返回的 sessionID。

接下来,在您的 BPEL 流程中包含一个 Java Embedding 流程活动,以发布包含用户名和口令的 URL。

以下示例代码说明了如何完成该任务:

String sessionString = "FAIL";
String wsLocation = "https://yourinstance.crmondemand.com/Services/Integration";
String headerName;
 try
 {
    // create an HTTPS connection to the OnDemand webservices
   URL wsURL = new URL(wsLocation + "?command=login");
    HttpURLConnection wsConnection = (HttpURLConnection)wsURL.openConnection(); 
   // disable caching
    wsConnection.setUseCaches(false); 
    // set some http headers to indicate the username and password we are using to logon 
   wsConnection.setRequestProperty("UserName", "myusername");
   wsConnection.setRequestProperty("Password", "myencryptedpassword"); 
    wsConnection.setRequestMethod("GET");                              
    // see if we got a successful response 
    if (wsConnection.getResponseCode() == HttpURLConnection.HTTP_OK) 
    { 
      // get the session id from the cookie setting
      for (int i=0; ; i++)
        {
        headerName = wsConnection.getHeaderFieldKey(i);
        if (headerName != null && headerName.equals("Set-Cookie"))
          {
          // found the Set-Cookie header (code assumes only one cookie is being set)
          sessionString = wsConnection.getHeaderField(i);
          break;
          }
        }
      String formattedID = sessionString.substring(sessionString.indexOf("=")+1,sessionString.indexOf(";")); 
      setVariableData("SessionID",formattedID); 
      //System.out.println("Session ID: " + sessionString); 
    } 
} 
catch (Exception e) 
{
   System.out.println("Logon Exception generated :: " + e); 
}

注意,该代码假设只设置了一个 cookie,并且对头进行分析以将其检索到先前定义的 SessionID 变量中。

接下来,使用相应的 WSDL 为您要调用的 Siebel OnDemand web 服务(例如帐户 web 服务)定义一个合作伙伴链接。

要获得 WSDL,您需要使用正确的凭证登录到 Siebel OnDemand 管理门户,并导航到门户的 Admin 部分下的 Web Services Administration 基目录。

现在,在您的 BPEL 流程中,使用 Assign 流程活动将以下表达式复制到合作伙伴链接,如下所示:

ora:parseEscapedXML(concat(string('
https://yourinstance.crmondemand.com/Services/Integration;jsessionid='),bpws:getVariableData('SessionID') , string('
ns1:Account')))


这将有效地替换默认 EndpointReference,因此它现在包含上述嵌入 JAVA 代码检索的 SessionID:

使用该方法,您可以调用任何 Siebel CRM OnDemand Web 服务。