Salesforce 敏捷(3)精益

完成本单元后,您将能够:

  • 解释精益原则。
  • 描述精益原则如何影响我们的敏捷过程。

在我们新的敏捷旅程中,我们需要创造强大的文化价值观来补充我们新的工作方式。所以,我们从精益软件开发实践中获得了一个页面,并拥有相同的价值观。

这七个值的Salesforce版本是:

  • 尊重人
  • 消除浪费
  • 提供快速
  • 准时决策
  • 优化整体
  • 创造知识
  • 建立质量
尊重人

我们不相信人们需要被告知如何去做他们的工作。我们认为管理者是“仆人领袖”,这意味着他们倾听他们的团队。我们喜欢雇用好人,然后让他们做自己的工作。如果我们把团队成员当作完成工作的手段,那么我们就不会有创造力和创新空间。

团队的成功发生在每个人都相互尊重,一起工作的时候。当个人努力超越自我时,团队往往不太成功。

那么这如何融入Salesforce呢?我们相信我们的Ohana文化对于我们的客户和我们的组织的成功至关重要。在夏威夷的文化中,奥哈纳表达了这样一个观点,即血缘关系或者被采纳关系的家庭是相互联系的,家庭成员是相互负责的。

消除浪费

难道你不想讨厌那些从未需要的东西?我们也讨厌这个。这就是为什么作为一家公司,我们努力优化资源,只为那些为我们的客户创造最大价值的项目工作。

这里有一些浪费时间的例子。

  • 多任务处理
  • 经营不善的会议
  • 工作分配的反应
  • 未完成的工作

为了确保我们不浪费任何时间,我们创建了ready的标准定义。这听起来就像是一个标准的事情列表,我们认为这是从一个工作项目开始所必需的。它旨在促进正确的对话,然后再浪费任何时间去处理某些事情,而只是为了发现它尚未准备好黄金时段,或者根本不需要。

你明白了。所以我们不要在这个特定的话题上浪费更多的时间。

提供快速

由于我们是一家始终走在创新前沿的领先企业,我们必须快速转型,跟上变化,保持竞争力。我们短暂的冲刺意味着我们不断学习什么是有效的,哪些是行不通的,并相应地做出改变。 (我们目前在技术和产品团队工作2周。

准时决策

我们避免了前期设计,而是倾向于拖延关键决策,直到最后一个负责任的时刻。这种做法有助于我们更好地了解客户需求当然,最后一个负责任的时刻是由团队自己决定的,这取决于工作的范围。

优化整体

Salesforce生态系统不仅仅是其部分的总和。为了保持对客户的信任和高质量,我们必须确保团队不在真空中工作。

我们授权我们的团队思考大,行动小,协作,失败,快速学习。

创造知识

我们希望尽可能地扩大学习和持续改进。我们短暂的冲刺使我们能够构建可持续测试的解决方案。

换句话说,我们的短周期使我们脚踏实地,始终学习,适应和创新。我们用这种工作方式 – 快速和激烈 – 与客户建立信任;我们始终将客户反馈纳入我们所做的一切。我们通过客户的成功来定义我们产品的价值。

我们在Salesforce分享知识的方式之一就是通过Chatter。团队可以去Chatter分享文件,文件和见解。我们甚至还加入了代码审查,配对编程和棕色包分享会等方面的知识,以保持团队的知名度。

我们也希望通过获得新的技能来确保我们团队中的每个人都在成长。如果团队中的每个人都只有一个专业知识,那就会使团队的生产力下降。我们希望创造一个人人分享知识和责任的均衡的学习环境。

建立质量

信任是我们的核心价值之一,这就是为什么我们一直在努力创造高品质的服务和产品,以建立客户的成功。

为了做到这一点,我们实施了一些技术实践,使我们所有的产品具有灵活性,可维护性,高效性和响应性。通过在工作中重构(或重构代码),我们帮助保持简单,清晰和简单。

与客户建立信任关系的另一个重要部分:确保我们拥有一套健全有效的测试流程。在我们转向敏捷之前,由于其他任务的出现,我们往往没有及时完成产品测试。这导致了延误。但是现在每个人都拥有质量的所有权 – 它不属于一个人。

我们所做的一件事情就是创建“混合工程师”,在技术和产品部门内废除质量工程师的职位。 这个新的工程师涵盖了完整的编码和测试周期 – 不再有单独的人员在流程的不同部分工作。

敏捷软件包

人们经常会问:“Salesforce的流程是什么?”那么,没有一个单一的流程。

我们的团队在工作类型上是多种多样的,所以我们不要求一种流程或实践。 最终,每个团队都必须根据精益原则和持续改进的概念来定义自己的流程。

我们倾向于让Ohana的文化和精益告知团队如何工作,授权他们做正确的事情,经理们支持他们实现一系列共同的目标。

Salesforce 敏捷(2)学习

完成本单元后,您将能够:

  • 解释敏捷宣言。
  • 定义敏捷原则和实践之间的区别。
  • 描述如何真正敏捷。

现在您已经明白了为什么Salesforce变得敏捷了,接下来我们将介绍如何将敏捷应用于实践。

这听起来很尴尬,但是敏捷和敏捷之间还是有区别的。敏捷意味着你知道你为什么这样做,而不是盲目地遵循一个过程。有一些最佳实践可以使你的团队敏捷。最终,如果您对以下三个问题可以回答“是”,那么您正在变得敏捷。

  • 我们的活动是专注于人吗?
  • 我们是否不断学习和改进以改进我们的流程和产品?
  • 我们是否经常向客户传递价值和喜悦?
敏捷的价值观

我们喜欢把我们的敏捷过程想像成一种美味的冰激凌圣代,层层叠叠,令人高兴。那么我们先来谈谈我们的敏捷思维的基础:冰淇淋圣代碗!

Image shows a representation of an ice cream sundae as a metaphor of how the Scrum values, principles, frameworks and practices are layered and how they relate to each other.

早在2001年,在该公司采纳敏捷之前,来自整个行业的17名软件工程师起草了敏捷宣言 – 一系列为Scrum奠定基础的价值观。这个宣言是浪费时间,金钱和精力的大型,昂贵的,经常中止或失败的软件项目的结果。他们寻找替代以往失败的文件重复,设计全部前沿的过程。

今天,这些价值观为我们提供了一个敏捷的思维方式。这个宣言是以人为基础和与创造一个成功和愉快的组织目标的合作。

这是“宣言”的一个片段:

“我们正在发现更好的方法来开发软件,并帮助其他人这样做。通过这项工作,我们已经开始重视:

  • 个人和流程和工具上的交互
  • 通过全面的文档工作软件
  • 客户协作合同谈判
  • 根据计划做出回应

也就是说,虽然右边的项目是有价值的,但我们更看重左边的项目。“

现在让我们深入这四个值。

过程和工具的个人和互动

敏捷的一部分意味着让你的团队指定他们自己的工作流程,而不是让传统的流程​​决定这个工作流程。在Salesforce,我们使用一个名为Agile Accelerator的平台,帮助团队管理工作流程和产品开发。

在我们这个规模的公司,你可以把团队分散在不同的建筑,州和国家。敏捷平台使我们能够保持无缝的通信规模 – 无论我们的时区如何。

在综合文档上工作的软件

那么我们如何确认我们正在取得真正的进展呢?我们依靠一个有形的结果:一个经过验证的软件,服务或可交付成果。换句话说,规范性文件本身并不能证明我们做的是正确的事情,也没有提供客户的价值。

客户协作合同谈判

作为一个以客户为中心的公司,部分意味着我们不只是假设我们知道什么对客户是最好的,我们实际上正在实施他们所说的最适合他们的事情。我们短暂的冲刺和持续改进流程帮助我们快速响应客户所需的变化。我们使用IdeaExchange(客户为我们提出想法的论坛)等机制来理解我们的客户发现的吸引力,实用性和令人兴奋的特点。

回应计划后的变更

我们在Salesforce所做工作的性质是创造性的,过程也是如此。我们不可能对每一个结果都确切地说,我们也不能提前预测旅程的每一个步骤 – 当你在冒险的时候,总会有一些弯路。不仅如此,我们需要快速响应客户反馈,这意味着发生了变化,而且发生得很快。

这就是为什么我们开始我们的所有介绍与安全港通知,告诫客户购买我们的服务,根据目前可用的功能做出购买决定,而不是我们所做的前瞻性陈述。

这并不是说我们靠裤子的位置来做事。我们的团队定期进行规划,从我们全公司的规划流程到发布规划,增量规划和每日计划会议。

敏捷原则一览
在下一层冰淇淋圣代上有12个敏捷的原则,为我们的迭代过程添加了味道。考虑一下你碗里的冰淇淋勺(当然是各种口味的)。

它们包括如下内容:

  • 保持简单
  • 拥抱变革以保持竞争力
  • 面对面沟通是最好的
  • 业务人员和开发人员在整个项目中一起工作

你可以阅读更多关于这里的原则。

构架

现在我们已经把所有的冰淇淋放在碗里了,现在是时候用软糖酱发疯了!继续吧,把你的冰激凌与各种确定的框架混合在一起,为角色和会议提供方法和指导,帮助我们将自己的思维和愿望付诸实践。 Salesforce使用的一些框架:Scrum,Kanban,Scrumban(两者兼有)和eXtreme Programming(这是一组技术最佳实践)。

实践

就像我们的圣代上洒满五彩斑斓,有许多敏捷,精益和技术实践,使人们以灵活和精益的方式制定框架。在Salesforce,这些实践包括计划的节奏,团队如何检查和调整,以及人们的角色和责任。每个员工都会制定年度计划文件和积压工作来管理和优先考虑工作。这是我们的混合工程实践和自动化测试环境的补充。

正是这些敏捷的价值观,原则,框架和实践帮助我们构建了Salesforce Ohana。

Salesforce 敏捷(1)理解

完成本单元后,您将能够:

  • 解释为什么Salesforce使用敏捷
  • 列举敏捷的一些好处
  • 定义Scrum
  • 解释“完成的定义”
  • 了解为什么敏捷过程为Salesforce更好地工作

想象一下,前往Dreamforce,只能了解到没有主题演讲,没有新的产品或服务公告,也没有可用于明年的创新或生产就绪功能。

这在2006年几乎发生在Salesforce,但是我们通过实施新的工作流程来避免这种情况,这个工作流程彻底改变了我们开发和交付产品的方式。

从1999年Salesforce成立以来,我们的技术和产品(T&P)团队像发条一样交付。 T&P团队之间的沟通和协作始终顺畅而简单。但是到了2006年,我们经历了惊人的增长 – 我们拥有更多的客户,更多的收入,更多的产品和更大的公司。就像任何增长的冲刺一样,这不是无痛苦的。

所有过去容易发生的事情都不再那么容易了。结果,我们开始经历创新的放缓。

扩大沟通,协作和管理,同时满足我们的发布日期已成为挑战。很明显,我们需要一种新的方法,一种以顺利的产品交付流程为中心的方法 – 一种确保没有发布延迟的方法。

Image is a graph showing how the time between major releases increased while the features delivered per team decreased over the time period of 2000 to 2006

所以我们做了我们最擅长的事情:我们冒了风险,重新提供了解决方案。我们采取了一套敏捷的原则和做法。

为什么敏捷?

我们在Salesforce所做的大部分工作都是基于创新和迭代的。也就是说,最后的结果并不总是事先知道,到达那里的路径是一个正在进行的工作。这总是一个新的冒险!

这并不是说Salesforce的所有团队都使用敏捷流程。有些团队使用瀑布框架,这是一个不太灵活的项目管理过程。您选择哪个流程取决于您知道什么 – 或不知道何时启动工作项目。

这里快速浏览一下瀑布的做法。

  • 一切都在前面计划。
  • 要求在实施之前被详细收集。
  • 继续前,每一步都必须完成。
  • 结果是在开始时确定的。

计划与适应

如果你想要决定哪个过程最适合你,请考虑这一点:如果你正在画一幅画,并且你已经决定了你的颜色,你的设置,你将花费多少时间来绘画,以及你的最终形象会是什么看起来像,那么你已经没有多少空间去改变。这并不是说这幅画不会是一幅毕加索的作品,但是你的过程并不是为了将新的想法或反馈结合在一起,以改变最终的形象(当然是更好)。那时你可能会使用瀑布方法。

但是当你迭代绘画的时候,你可以期望根据早期的反馈,新的想法,甚至是新的学习(那些颜色冲突!)而不是以有计划的,增量的顺序进行绘画。这是一个更敏捷的方法。

以下是这两个绘画过程的视觉效果:

Image shows an illustration of a painting of a person in progress. It shows what the painting would look like in the various stages when using the Waterfall process and the Agile process.

图片基于杰夫·巴顿的工作,经许可使用,jpattonassociates.com

工作复杂性

所以现在你知道不同的过程对于不同类型的工作更好。那么如何确定哪个流程最适合您和您的团队呢?考虑这些事情。

何时选择瀑布

简单的工作:

  • 工作简单而可预见。
  • 任何人都可以决定如何完成这项工作。

复杂的工作:

  • 这项工作是可以预测的,但需要专业知识。
  • 工作可以自动化。

何时选择敏捷

复杂的工作:

  • 这项工作是基于一致的反馈,风险和创新。
    • 你想尝试一下,看看它是如何工作的,根据新的知识改变课程。
    • 你正在创造新的产品,软件和服务,而你正在做的事情从未做过。

试图选择一个工作流程时,问问自己这些问题。

  • 我们对手头项目了解多少?
    • 项目的目标和要求有多清晰?
    • 解决方案有多清晰明确?
    • 什么是团队和利益相关者使用这些方法的经验?
    • 这项工作有多复杂?
以敏捷的方式扩大Salesforce

此时,Salesforce领导层开始尝试在各个团队实施敏捷实践。有一些推迟,但Salesforce高管支持这个概念,并在2006年,Salesforce技术与产品团队重组为一个敏捷开发团队。

这是什么样子?那么,我们做了以下。

  1. 采用了新的交付思维模式
  2. 实施标准化流程
  3. 接受精益原则(我们稍后会告诉你更多!)
  4. 标准化“完成的工作”的含义

我们新的敏捷思维

这个敏捷过程究竟是什么?简而言之,敏捷是各种技术实践,流程,框架,原则和价值的总称,它们要求工作流程的灵活性和对产品的迭代改变。

这是一个时间盒式的迭代方法,工作团队从项目开始阶段逐步建立可交付成果,而不是试图最终交付最终产品。敏捷帮助团队协调一致,提高质量,并迫使每个人衡量和管理进度,以更快地为客户创造更多价值。

对于Salesforce来说,它非常合适,因为我们正在寻求解决我们的沟通和扩大成长的痛苦。

我们新的敏捷过程:从五万英尺的视野

我们选择在Salesforce选择实施的敏捷流程之一是Scrum,我们以特定的原则来支持这些流程,这些原则定义了我们今天的工作方式。

什么是Scrum?

Scrum是一个过程,具有明确的角色,会议和交付物,提供了为客户提供高质量价值的框架。

为什么我们采用Scrum?

Scrum为我们提供了一个灵活的框架,以找出哪些产品可行,哪些不适用于我们的产品,并相应地进行更改。在Scrum中,每个人都拥有所有权,并且在面对他们面前的工作时有着共同的期望。

什么Scrum过程看起来像在Salesforce?

那么当我们通过它时,有150人被组织成小型的跨职能团队,短时间迭代(我们称之为冲刺)。目标是稳定交付和组织我们的过程。目前,大多数Salesforce云团队使用敏捷和Scrum的一些变化。

什么是精益原则?

我们也接受精益原则。这七条陈述描述了我们的工作流程和交付流程。他们反映了我们的Ohana文化,突出人们如何共同努力,促进我们的成功结构。我们稍后会更详细地介绍它们。

“成就”工作的新定义

现在我们有了一种新的工作方式,团队可以在学习关于工作流程和产品的新信息时成功地重复他们的流程。但是,我们怎么知道我们真的做了工作?

简单。我们为技术和产品团队创建了完成(DoD)的标准定义,以便每个人都可以在什么时候明确地清楚完成。

这里有一个需要考虑的场景:想象一下你需要创建一个新的产品功能。您将这个新任务分配给您的团队,并要求他们在本月实施。他们这样做,继续前进。快进几个月,完成的工作项目重新出现新的问题。也许有客户抱怨,因为集成没有得到充分测试。也许安全问题没有得到解决,或者性能没有达到标准。结论:工作项目实际上没有完成,至少不够部署。

我们对“完成”的定义是一套指导方针,指导团队在完成任务之前所要做的一切。为此创建一个标准对于维护Salesforce的核心价值至关重要:信任。

简而言之
我们不断地问自己:“我们做对了吗?”这就是我们如何确保将我们的客户放在我们所做的一切的中心。

Scrum流程的严密性以及敏捷和精益的思维方式是提高我们的交付和确保顺畅的发布的核心。这是Salesforce每年为我们的客户提供三个主要版本的关键。

Salesforce Connect(3)外部对象

学习目标

完成本单元后,您将能够:

  • 配置外部查找关系。
  • 配置间接查找关系。
  • 自定义外部数据的显示。
  • 为外部对象启用记录提要。
  • 在Salesforce应用程序中显示外部数据。

定义外部对象的关系

配置外部数据源和定义的外部对象后,可以使用关系字段将外部数据集成到Salesforce中。您可以为外部对象定义三种类型的关系。

  • 查找关系—将子标准,自定义或外部对象链接到父标准或自定义对象。如果外部数据包含通过18个字符的ID标识相关Salesforce记录的列,则只能使用此类关系。如果不是这种情况,请使用以下两种类型的关系之一,这对外部对象是唯一的。
  • 外部查找关系—将子标准,自定义或外部对象链接到父级外部对象。父外部对象上的标准外部标识字段的值与外部查找关系字段的值相匹配。对于子外部对象,外部查找关系字段的值来自指定的外部列名称。
  • 间接查找关系—将子外部对象链接到父标准或自定义对象。您在父对象上选择一个自定义唯一的外部ID字段,以匹配子值的间接查找关系字段,其值由指定的外部列名称确定。

该表总结了不同类型的外部对象关系。

关系类型 子对象 父对象 必须包含Salesforce ID的外部数据?
Lookup 标准,自定义或外部 标准或自定义 Yes
External Lookup 标准,自定义或外部 External No
Indirect Lookup 外部 标准或自定义 No

作为示例,我们来看看如何配置查询关系,以便将订单链接到其行项目以及Salesforce组织中的帐户。

配置外部查找关系

在之前的单位中,您可以查看Salesforce组织中的外部订单数据。回想一下,当您选择订单表进行同步时,您还选择了OrderDetails表,其中包含每个订单的订单项。通过创建从OrderDetails到订单的外部查找关系,您可以在组织中的订单页面上看到订单项。实际上,您告诉Salesforce一个对象上的字段(OrderDetails上的OrderId)对应于外部对象(Orders)上的外部ID字段。

  1. 登录到您的Salesforce Developer Edition。
  2. 从设置中,在快速查找框中输入外部对象,然后选择 External Objects.
  3. 单击 OrderDetails 外部对象。Order details screen
  4. 点击订单ID旁边的Edit 链接。Edit Order ID
  5. 点击 Change Field Type 按钮。Edit Order ID details
  6. 选择 External Lookup Relationship 然后单击下一步。外部查找关系可以将任何对象链接到外部对象。
  7. 选择 Orders 作为相关对象,然后单击 Next.Choose related external object
  8. 输入18作为长度,然后单击下一步。
  9. 要使关系对所有配置文件都可见,请选择“可见”选项,然后单击“下一步”。Specify FLS for external lookup relationship在真正的生产部署中,您将仔细分析哪些配置文件应该有权访问订单行项目。
  10. 单击 Save 以接受默认设置 – 您一定要在订单页面布局上订购详细信息相关列表!
  11. 使用应用程序菜单(左上角)启动订单。
  12. 在“最近订单”列表中单击订单的外部标识。View External ID of order
  13. 确认您看到订单的订单项列表。View line items for order

您可以点击订单项的外部ID来查看其详细信息,但是在相关列表中,我们将在此处显示订单项详细信息。

  1. 在安装程序中,使用快速查找框转到对象管理器。
  2. 点击Order对象,然后点击 Page Layouts | Order Layout.
  3. 在“订单布局”框中,单击 Related Lists.Edit layout for order details
  4. 向下滚动到OrderDetails相关列表,然后单击扳手图标。Edit layout for order details
  5. 从所选字段中删除显示URL,添加产品,数量和单价,然后单击确定。Related list properties dialog
  6. 点击页面顶部的快速保存。现在您可以在相关列表中看到订单项详细信息。

配置间接查找关系

现在您可以在订单页面上看到订单项,下一步是配置订单和帐户之间的间接查询关系。这种关系使您的用户能够查看给定订单与哪个客户关联以及给定客户的所有订单。

间接查找关系模拟外部对象与自定义或标准对象之间的外键关系。这次,您告诉Salesforce外部对象(订单上的customerId)上的字段对应于自定义或标准对象(帐户上的Customer_ID__c)上唯一的外部ID字段。这是间接查找,因为它引用标准ID字段以外的字段。

  1. 在安装程序中,使用快速查找框转到对象管理器。
  2. 点击订单对象,然后点击 Fields and Relationships.
  3. 点击客户ID旁边的修改。Edit customer ID screen
  4. 点击 Change Field Type 按钮。
  5. 选择 Indirect Lookup Relationship 然后单击 Next. 间接查找关系将外部对象(如订单)链接到标准对象(如帐户,甚至自定义对象)。
  6. 选择 Account 作为相关对象,然后单击 Next.Select account
  7. 选择 Customer_ID__c 作为目标字段的值,然后单击 Next.Select customer ID
  8. 输入18作为长度,然后单击 Next.
  9. 要使关系对所有配置文件都可见,请选择“可见”选项,然后单击 Next.
  10. 单击保存以接受默认值 – 您希望帐户页面布局上的订单相关列表!
  11. 如果应用程序菜单(右上角)未显示外部订单,请单击应用程序菜单并选择它。
  12. 点击 Orders 标签。
  13. 在“最近订单”列表中单击订单的外部标识。
  14. 确认订单在customerID字段中显示链接。
  15. 点击客户ID链接。你被带到相应的帐户页面。滚动到底部查看订单列表。Orders related list
  16. 同样,您可以自定义UI以在相关列表中显示更多有用的信息。通过单击页面右侧的灰色三角形选择Force.com快速访问菜单。
  17. 选择 Edit Layout.
  18. 向下滚动到订单相关列表,然后点击扳手图标。
  19. 从所选字段中删除显示URL,添加orderDate和shippedDate。对于“排序方式”,单击“订单日期”并选择“降序”,以便首先查看最近的订单。点击 OK.Orders related list properties
  20. 点击页面顶部的保存,向下滚动,在相关列表中查看订单日期。Account with edited list

现在您的外部订单数据与帐户无缝集成。

为外部数据启用Chatter

要将外部数据进一步集成到Salesforce组织中,让我们看看如何在订单记录上启用Chatter订阅源。在当前版本中,外部对象不可用字段跟踪;也就是说,我们不能将Salesforce配置为在其字段值更改时发布到记录的Chatter提要,但我们仍然可以启用Chatter提要。

  1. 登录到您的Salesforce Developer Edition。
  2. 从设置中,在快速查找框中输入Feed Tracking,然后选择Feed Tracking。
  3. 选择订单(请注意复数;单数订单是标准对象),请点击启用Feed追踪,然后点击保存。Enable Feed Tracking checkbox
  4. 使用应用启动器转到订单应用。
  5. 在“最近订单”列表中单击订单的外部标识。
  6. 现在订单有一个Follow按钮,用户可以点击订阅它的Chatter feed。Record feed on an external object detail page

查看Salesforce应用程序中的外部数据

当您的外部数据在您的Salesforce组织中可用时,您可以在Salesforce应用程序中查看它。

  1. 启动Salesforce应用程序。您可以在移动设备(获取应用程序)或Salesforce Mobile Simulator Chrome App上运行应用程序。如果需要,请使用Developer Edition用户名和密码登录。
  2. 点击Salesforce App Nav以打开导航菜单Salesforce App Nav。帐户和订单显示在最近列表的顶部。如果他们不在顶部,点击“更多”以显示“最近”列表中的所有对象。
    Navigation menu
  3. 点按订单查看近期订单列表。除了已配置的外部对象之外,还列出了具有相同名称的标准对象Orders。如果点击订单并查看最近没有记录,请查找其他订单对象。
    Recent orders
  4. 您在上一步中查看的订单显示在列表顶部。点击它查看其详细信息。
    Order details
  5. 点按Feed以查看订单记录的Feed和您的Feed帖子。Record feed
  6. 点击相关,然后点击OrderDetails查看订单的订单项。Related order line items
  7. 点击Salesforce应用程序的后退箭头Salesforce app's back arrow两次,然后点击Salesforce App NavSalesforce App Nav。点击帐户以查看最近的帐户列表。
  8. 点击列表中的顶级帐户,然后点击相关。向下滚动相关列表,然后点击订单查看该账户的订单。
    Orders related to the account

如您所见,您的外部数据在Salesforce应用程序中可用,就像它在整个Salesforce站点中一样,不需要额外的配置!

Salesforce Connect(2)设置

学习目标

完成本单元后,您将能够:

  • 在您的Salesforce组织中创建外部数据源,以指定如何连接到外部系统。
  • 验证与外部系统的连接。
  • 同步以创建映射到外部系统模式的外部对象。
  • 查看外部对象。

设置概述

使用Salesforce Connect设置外部数据集成涉及到这些高级步骤。

  1. 创建外部数据源. 如果您的外部系统承载多个服务,则为每个访问数据所需的服务创建一个外部数据源。
  2. 创建外部对象及其字段。 在您的Salesforce组织中为每个要访问的外部数据表创建一个外部对象。在每个外部对象上,为要从Salesforce组织访问的每个外部表列创建一个自定义字段。

    注意

    如果外部系统允许,我们建议您同步外部数据源以自动创建相关的外部对象。您也可以选择手动定义外部对象来自定义外部对象名称并手动创建自定义字段。

  3. 定义外部对象的关系. 创建查找,外部查找和间接查找关系字段,以跨系统边界提供数据的无缝视图。
  4. 允许用户访问外部对象及其字段. 通过权限集或配置文件授予对象和字段权限。
  5. 设置用户认证. 对于使用每个用户身份验证的每个外部数据源,请执行以下两项操作。
    1. 使用户能够对外部数据源进行身份验证. 通过权限集或配置文件授予用户访问权限
    2. 设置每个用户的身份验证设置. 告诉您的用户如何设置和管理他们自己的个人设置中的外部系统的身份验证设置。或者,您可以为每个用户执行此任务。

作为此模块的一部分,您可以将示例订单数据与Salesforce Developer Edition中的现有帐户数据相集成。要完成这些步骤,您需要安装一个测试包,用于在帐户对象上配置必要的架构,创建一个Customer ID字段,并为每个帐户分配一个Customer ID值。

按照以下步骤安装软件包。

  1. 打开浏览器,点击这里 click here 开始安装。
  2. 选择 Install for Admins Only.
  3. 点击 Install.Installer for the Salesforce Connect Quickstart package
  4. 选择 External Orders 应用程序。
  5. 点击 Set Customer IDs 将客户ID号码分配到Developer Edition中的样例帐户记录。Assign Customer IDs to sample account records

您的Salesforce Developer Edition现在已经安装在本教程的主要部分。现在是整合一些数据的时候了!

连接外部数据源

作为练习,让我们连接一个可公开访问的现有OData 2.0数据源。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择 External Data Sources.
  2. 点击 New External Data Source.
  3. 输入OrderDB作为标签。当您从标签字段中单击或远离标签时,名称字段默认为OrderDB。
  4. 选择 Salesforce Connect: OData 2.0 作为类型。
  5. 输入 https://orderdb.herokuapp.com/orders.svc/作为网址。
  6. 保留其他设置的默认值,然后单击 Save.

注意

因为这是一个示例,只读数据库,所以不需要身份验证。一个真正的外部系统可能需要一些凭证。您可以将Salesforce Connect配置为对所有数据源访问使用同一组凭据,或者为每个用户使用单独的凭据。

现在您已经配置了一个外部数据源,您可以选择您希望集成到您的Salesforce组织中的表。

创建外部对象

您可以创建或修改外部对象。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择外部数据源,然后单击OrderDB外部数据源。
  2. 点击 Validate and Sync.

    注意

    Salesforce Connect从示例数据库中检索OData 2.0元数据并列出可用的表。点击这里查看元数据XML。

  3. 选择订单和订单明细。
    Validate External Data Source dialog
  4. 点击 Sync.

同步将创建与所选表相对应的外部对象。同步不会在Salesforce中存储任何数据。同步仅将映射定义到包含数据的外部表或存储库。这些映射使Salesforce能够访问和搜索外部数据。

注意

您可以选择手动创建外部对象。这样做使您可以自定义外部对象名称,决定为哪些表格列创建自定义字段,并自定义字段名称。从设置中,在快速查找框中输入外部对象,然后选择外部对象。

查看外部数据

连接外部数据源并定义外部对象之后,可以直接在Salesforce组织中查看外部数据。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择 External Data Sources.
  2. 点击OrderDB外部数据源。
  3. 向下滚动到外部对象,然后单击 Orders.View external objects page
Salesforce Connect的同步进程从外部系统的模式创建此外部对象。如果您熟悉自定义对象,则会注意到外部对象看起来很相似。同步过程还创建了一组自定义字段,就像您为自定义对象创建它们一样。外部对象和自定义对象定义之间的主要区别是:

  • 外部对象API名称具有后缀__x而不是__c。
  • 外部对象具有对其外部数据源和该源内的表的引用。
  • 外部对象具有不同的标准字段。显示URL是表示外部数据库中的记录的OData 2.0 URL,而外部ID是每个记录的主键值。

External objects details page

让我们创建一个自定义选项卡,轻松访问订单记录。

  1. 从设置中,在快速查找框中输入标签,然后选择 Tabs.
  2. 单击自定义对象选项卡旁边的New 按钮。
  3. 选择Orders 作为对象
  4. 单击“选项卡样式”旁边的选择器,然后选择您喜欢的任何样式。
  5. 点击 Next.
  6. 点击 Next 以接受默认选项卡可见性设置。
  7. 点击“包含”标签旁边的复选框取消选择所有应用。
  8. 点击外部订单旁边的复选框将其选中。
  9. 点击 Save.

注意

因为还有一个名为Order的标准对象,所以现在有两个标签为Orders的选项卡。您可以通过更改对象定义中的标签来更改外部对象的选项卡名称。

您现在可以查看外部订单数据,就好像它存储在您的Salesforce组织中的自定义对象中一样。

  1. 如果应用程序菜单(右上角)未显示外部订单,请单击应用程序菜单并选择它。
  2. 点击 Orders 标签。
  3. 点击 Go! 按钮在“查看:全部”旁边。View list of external ordersSalesforce Connect从样本订单数据库中检索到前25个订单记录的订单ID。您可以像在任何其他列表视图中一样配置要显示的字段。
  4. 点击其中一个外部ID值。View details of external orderSalesforce Connect检索您选择的订单的所有字段值。
    请记住,外部数据在您的Salesforce组织中绝不会重复。 Salesforce Connect总是实时从外部系统获取当前数据。

    现在您可以在组织中看到外部数据,也可以通过创建查找关系将其链接到现有数据。你会看到如何在稍后的单位做到这一点。

设置用户认证

本机使用的示例数据库不需要认证。但是,真正的外部系统可能需要登录凭据。您有两个选项可用于设置外部数据源的用户身份验证。

  • 命名委托人—您的整个Salesforce组织在外部系统上共享一个登录帐户。
  • 每个用户—您的组织在外部系统上使用多个登录帐户。您或您的用户可以为外部系统设置个人身份验证设置。
    有关更多信息,请参阅Salesforce帮助中的外部数据源的标识类型。

Salesforce Connect(1)介绍

学习目标

完成本单元后,您将能够:

  • 解释Salesforce Connect是什么。
  • 描述Salesforce Connect的两个典型用例。
  • 说明Salesforce Connect与提取,转换和加载(ETL)工具的不同之处。
  • 解释外部对象如何与标准和自定义对象不同。

Salesforce Connect概述

Salesforce Connect是一个使您能够查看,搜索和修改存储在Salesforce组织外部的数据的框架。例如,您可能拥有存储在企业资源规划(ERP)系统中的数据。您可以使用外部对象通过Web服务标注实时访问数据,而不是将数据复制到您的组织中。

Salesforce Connect可让您的Salesforce组织从多种外部系统访问数据。您可以实时整合来自SAP®NetWeaver Gateway,MicrosoftDynamics®NAV和许多其他数据源的表格,无需编写一行代码。以前,将外部数据与Salesforce集成的唯一方法是使用提取,转换和加载(ETL)工具。该过程非常耗时,并且需要将数据复制到您的组织中,而您可能永远不会使用这些数据,或者很快就会过时。而Salesforce Connect将外部系统中的数据表映射到组织中的外部对象。

外部对象与自定义对象类似,只不过它们映射到位于Salesforce组织外部的数据。外部对象数据始终是最新的。 Salesforce Connect提供到外部数据的实时连接,而不是消耗存储空间的副本,并且必须定期同步。访问外部对象实时从外部系统获取数据。

如果大多数条件适用,我们建议您使用Salesforce Connect。

  • 您有大量不想复制到Salesforce组织中的数据。
  • 您在任何时候都需要少量的数据。
  • 您需要实时访问最新的数据。
  • 您将数据存储在云或后台系统中,但希望显示或处理Salesforce组织中的数据。

外部对象与自定义对象

外部对象与自定义对象有许多相同的功能。例如,您可以:

  • 通过列表视图,详细信息页面,记录源,自定义选项卡和页面布局访问外部对象。
  • 定义外部对象与标准或自定义对象之间的关系,以整合不同来源的数据。
  • 在外部对象页面上启用Chatter订阅源以进行协作。
  • 对外部对象启用创建,编辑和删除操作。

如果您需要频繁访问大量的外部数据,ETL可能仍然是您获得最佳性能的最佳选择。外部对象不是ETL的替代品。它们是访问提供巨大收益的外部数据的补充方法,包括与Salesforce平台的无缝集成,包括我们的API,移动,Chatter等等。例如,外部对象可用于标准Salesforce工具,如Salesforce应用程序,全局搜索,SOSL和SOQL查询,Apex,Visualforce,API,更改集和包。

以下是外部对象和自定义对象支持的功能的快速比较。

特征 自定义对象 外部对象
数据存储在您的Salesforce组织中 Yes No
Read Yes Yes
Write Yes Yes (limited)
Tabs, layouts Yes Yes
Visualforce Yes Yes
Field-level security Yes Yes
Sharing Yes No
REST and SOAP API Yes Yes
SOQL Yes Yes (limited)
Search and SOSL Yes Yes (pass-through)
Formula fields Yes Not Yet
Workflow, triggers Yes Not Yet
Reports and analytics Yes Yes (limited)
Chatter Yes Yes (no field tracking)

一个Salesforce连接示例

假设您将产品订单信息存储在外部数据库中,并且您希望将这些订单作为Salesforce中每个帐户记录上的相关列表进行查看。通过Salesforce Connect,您可以为订单设置父帐户对象与子外部对象之间的关系。然后,您可以设置父对象的页面布局,以包含显示子记录的相关列表。

下图显示了Salesforce Connect如何跨系统边界提供数据的无缝视图。 Business_Partner外部对象的记录详细信息页面包含两个相关的子对象列表。

  • 客户标准对象(1)
  • Sales_Order外部对象(2)

External objects example

在此示例中,外部查找关系和页面布局使用户能够在单个页面上查看Salesforce org内部和外部存储的相关数据。

外部连接的类型

要连接到存储在外部系统上的数据,Salesforce Connect使用这些专门设计的适配器之一。

  • OData 2.0适配器或OData 4.0适配器—连接到Internet上任何OData 2.0或4.0生产者公开的数据。 OData(开放数据协议)是用于集成数据的现代基于REST的协议。 SAP和Microsoft等供应商已经实施了OData支持,因此可以直接访问NetWeaver和SharePoint等产品。 来自Salesforce合作伙伴的集成产品将Salesforce Connect的范围扩展到更广泛的后台系统。
  • 跨组织适配器—连接到存储在另一个Salesforce组织中的数据。 跨组织适配器使用标准的Force.com REST API。 它直接连接到另一个组织,而不需要中间Web服务,就像OData一样。
  • 通过Apex创建定制适配器—如果OData和跨组织适配器不适合您的需要,请使用Apex Connector Framework开发您自己的适配器。

Apex-事件驱动(3)

学习目标

完成本单元后,您将能够:

  • 描述如何订阅平台事件消息。
  • 使用Apex触发器订阅事件。
  • 用Apex测试方法测试平台事件。
  • 通过CometD订阅平台事件。

订阅平台事件

现在您已经看到了如何发布平台事件,您如何订阅他们以获得最新消息或发货的通知?在Salesforce平台上,Apex触发器,流程和流程接收事件通知。 Visualforce和Lightning组件应用程序通过CometD接收事件。在外部应用程序中,您也可以使用CometD订阅事件。

使用Apex触发器订阅平台事件通知

您可能以前使用过Apex触发器,以基于数据库事件执行操作。通过平台事件,过程是相似的。您只需在事件对象上插入一个插入Apex触发器来订阅传入事件即可。触发器在Apex中提供自动订阅机制。不需要明确创建和收听频道。触发器接收来自各种来源的事件通知,不管它们是通过Apex还是API发布的。

平台事件仅在插入触发器后才支持。后插入触发器事件对应于发布平台事件之后的时间。事件消息发布后,触发后插入触发器。

要创建平台事件触发器,请使用开发者控制台。

  1. 单击设置图标,选择 Developer Console, 然后单击 File | New | Apex Trigger.
  2. 提供一个名称并为sObject选择事件,然后单击 Submit.

开发者控制台会自动在触发器模板中添加after插入事件。另外,您可以方便地从“触发器”相关列表中的“设置”中的事件定义页面创建触发器,但是必须指定after insert关键字。

以下示例显示了Cloud News事件的触发器。它遍历每个事件并通过Urgent__c字段检查消息是否紧急。如果消息紧急,则触发器创建一个派发新闻记者的案例,并将事件位置添加到案例主题。

// 触发Cloud_News事件。
trigger CloudNewsTrigger on Cloud_News__e (after insert) {    
    // 列举所有要创建的案例。
    List<Case> cases = new List<Case>();
    
    // 获取案例所有者的队列ID
    Group queue = [SELECT Id FROM Group WHERE Name='Regional Dispatch' LIMIT 1];
       
    // 遍历每个通知
    for (Cloud_News__e event : Trigger.New) {
        if (event.Urgent__c == true) {
            // Create Case to dispatch new team.
            Case cs = new Case();
            cs.Priority = 'High';
            cs.Subject = 'News team dispatch to ' + 
                event.Location__c;
            cs.OwnerId = queue.Id;
            cases.add(cs);
        }
   }
    
    // 插入与收到的事件相对应的所有案例。
    insert cases;
}
设置调试日志记录

与标准或自定义对象上的触发器不同,平台事件上的触发器不会在与发布事件相同的Apex事务中执行。触发器在系统用户Automated Process实体下的自己的进程中运行。因此,与触发器执行相对应的调试日志由Automated Process实体创建,并且在Developer Console中不可用。要收集平台事件触发器日志,请在“安装”中为“自动过程”实体添加跟踪标志条目。

  1. 在安装程序中,在快速查找框中输入调试日志,然后单击 Debug Logs.
  2. 点击 New.
  3. 对于跟踪的实体类型,请选择 Automated Process.
  4. 选择您要收集的日志的开始日期和到期日期。
  5. 对于调试级别,输入*然后单击 Search.
  6. 选择一个预定义的调试级别,例如SFDC_DevConsole或单击New来创建您自己的调试级别。
  7. 点击 Save.

注意

Apex测试的调试日志是一个例外。它们包括在同一个测试执行日志中记录事件触发器。

有关平台事件触发器的注意事项

事件处理的顺序
触发器按收到的顺序处理平台事件通知。事件的顺序基于事件重播ID。 Apex触发器可以一次接收一批事件。事件的顺序保存在每个批次中。批处理中的事件可以来自一个或多个发布者。
异步触发器执行
平台事件触发器异步运行在其自己的进程中,不是发布事件的事务的一部分。因此,事件发布时间和触发器处理事件之间可能存在延迟。不要期望触发器执行的结果在事件发布之后立即可用。
自动化的过程系统用户
由于平台事件触发器不会在执行它们的用户(正在运行的用户)下运行,而是在Automated Process系统用户下运行,所以我们在CloudNewsTrigger示例中明确地设置了所有者ID字段。我们使用了一个称为Regional Dispatch的示例用户队列的ID作为触发器示例。如果您在触发器(例如案例或商机)中创建带有OwnerId字段的Salesforce记录,请明确设置所有者ID。对于案例和潜在客户,您可以使用分配规则来设置所有者。
此外,系统字段(例如CreatedById和LastModifiedById)引用自动处理实体,而不是正在运行的用户。
Apex Governor 限制
与标准或自定义对象触发器一样,平台事件触发器也受到Apex控制器限制。
Apex Trigger 限制
平台事件触发器共享许多自定义和标准对象触发器的相同限制。例如,您不能从触发器中同步创建Apex标注。

订阅事件定义页面上的相关列表

您可以在安装程序的“平台事件定义详细信息”页面上查看所有事件触发器的状态。 CometD用户不在此列表中。在订阅下,每个激活的触发器都与执行信息和状态一起列出。信息包括上次发布和上次处理事件的重播ID。由于错误不可恢复或权限不足,状态会指示触发器是否正在运行或已与订阅断开连接。仅当触发器重试次数达到最大次数时,才会达到错误状态。以下屏幕截图显示了“云新闻”事件详细信息页面上的“订阅”相关列表。

Subscriptions related list shows the state of subscribed triggers

测试平台事件触发器

通过添加Apex测试,确保您的平台事件触发器正常工作。在将任何Apex代码(包括触发器)打包或部署到生产之前,您的Apex代码必须进行测试。要在Apex测试中发布平台事件,请将发布语句放在Test.startTest和Test.stopTest语句中。

// 创建测试事件
Test.startTest();
// 发布事件
Test.stopTest();
// 在这里执行验证
在测试上下文中,发布方法调用将发布操作排队。 Test.stopTest()语句导致事件发布被执行。 Test.stopTest()后,执行您的验证。

以下是我们的Cloud_News事件及其相关触发器的测试类示例。发布事件会导致关联的触发器触发。在Test.stopTest()之后,测试通过检查Database.SaveResult中的isSuccess()返回的值来验证发布是否成功。另外,测试查询触发器创建的情况。如果找到案例记录,则触发器成功执行,并通过测试。

@isTest
public class PlatformEventTest {
    @isTest static void test1() {
        // 创建测试事件实例
        Cloud_News__e newsEvent = new Cloud_News__e(
            Location__c='Mountain City', 
            Urgent__c=true, 
            News_Content__c='Test message.');
        
        Test.startTest();

        // 调用方法来发布事件
        Database.SaveResult sr = EventBus.publish(newsEvent);
        
        Test.stopTest();
        
        // 在这里执行验证

        // 验证发布是否成功
        System.assertEquals(true, sr.isSuccess());

        // 检查创建的触发器是否存在。
        List<Case> cases = [SELECT Id FROM Case];
        // 验证是否发现此案例。
        // 在测试上下文中只有一个测试用例。
        System.assertEquals(1, cases.size());
    }
}

使用点击订阅平台事件通知

要订阅没有代码的事件消息,请创建一个在发生平台事件时启动的进程。

此屏幕截图显示了一个进程在发生Cloud News事件时开始。当它开始时,该过程查找邮件城市匹配事件通知位置的联系人记录。

Process Builder matching criteria screen

同样,您可以通过使用Wait元素来订阅具有流程的平台事件消息。当发生平台事件时,不是启动流程,而是先前启动的流程等待平台事件,然后恢复。例如,以下是等待Cloud News事件消息发生的Wait元素。只有当事件的位置匹配{!MailingCity_Location.MailingCity}时才会继续。 {!MailingCity_Location}是流中的一个sObject变量。

Cloud Flow Designer Wait element

使用CometD订阅平台事件通知

外部应用程序使用CometD订阅平台事件并执行长时间轮询。平台应用程序(如Visualforce页面和Lightning组件)也可以使用CometD。 CometD是一个可扩展的基于HTTP的事件路由总线,它使用了一种名为Comet的AJAX推送技术模式。它实现了Bayeux协议。长轮询(也称为Comet编程)允许模拟从服务器到客户端的信息推送。与普通轮询类似,客户端连接并请求来自服务器的信息。但是,如果信息不可用,服务器不会发送空的响应,而是等待信息可用(发生事件)。

Salesforce提供了一个Java库EMP连接器,该连接器实现了连接到CometD和监听通道的所有细节。您可以使用EMP Connector轻松订阅平台事件。 EMP连接器隐藏了订阅事件的复杂性。有关EMP Connector的更多信息,请查看Streaming API开发人员指南中的Java客户端示例。

通过CometD订阅平台事件通知的过程与订阅PushTopic事件或通用事件类似。唯一的区别是频道名称。以下是平台事件主题(频道)名称的格式:

/event/<EventName>__e
例如,如果您有名为“云新闻”的平台事件,请在订阅时提供此频道名称。
/event/Cloud_News__e
在CometD URL末尾指定API版本,如下所示。
// 连接到CometD端点
    cometd.configure({
               url: 'https://<Salesforce_URL>/cometd/41.0/',
               requestHeaders: { Authorization: 'OAuth <Session_ID>'}
    });

JSON格式的平台事件消息

交付平台事件的消息与Cloud News事件的以下示例类似。

{
  "data": {
    "schema": "_2DBiqh-utQNAjUH78FdbQ", 
    "payload": {
      "CreatedDate": "2017-04-27T16:50:40Z", 
      "CreatedById": "005D0000001cSZs", 
      "Location__c": "San Francisco", 
      "Urgent__c": true, 
      "News_Content__c": "Large highway is closed due to asteroid collision."
    }, 
    "event": {
      "replayId": 2
    }
  }, 
  "channel": "/event/Cloud_News__e"
}

事件消息中的模式字段包含平台事件模式的标识(在本例中为“schema”:“_2DBiqh-utQNAjUH78FdbQ”)。模式是版本化的 – 当模式改变时,模式ID也改变。

要确定事件的模式是否已更改,请通过REST API检索模式。通过对此REST API资源执行GET请求来使用模式标识:/vXX.X/event/eventSchema/Schema_ID。或者,您可以通过将事件名称提供给此端点来检索事件模式:/vXX.X/sobjects/Platform_Event_Name__e/eventSchema。有关更多信息,请参阅Force.com REST API开发人员指南。

注意

与PushTopic和泛型事件不同,平台事件不支持使用过滤的订阅。例如,订阅/事件/ Cloud_News__e?Location__c =’旧金山’按位置过滤不受支持。

现在您已经看到了如何在Salesforce平台和外部应用程序中使用平台事件,这种可能性是无止境的!将平台事件用于任何数量的应用程序和集成,例如处理业务交易或参与主动客户服务。借助平台事件,您可以采用基于事件的编程模式,并享受基于事件的软件架构的优势。

Apex-事件驱动(2)

学习目标

完成本单元后,您将能够:

  • 定义一个平台事件。
  • 描述如何发布平台事件消息。
  • 使用Apex方法发布一个事件。
  • 通过插入一个sObject来发布一个使用REST API的事件。

定义和发布平台事件

现在,您已经了解了平台事件以及何时使用了平台事件,接下来我们将介绍如何定义平台事件。还记得云端通讯社吗?我们来创建一个平台事件定义来保存新闻事件的数据。

定义一个名为Cloud News的平台事件:

  1. 从安装程序中,在快速查找框中输入平台事件,然后选择 Platform Events.
  2. 在“平台事件”页面上,单击 New Platform Event.
  3. 对于标签,请输入 Cloud News.
  4. 对于多标签,请输入 Cloud News.
  5. 对于描述,输入 Cloud news events deliver news at your fingertips.
  6. 点击 Save.
  7. 在“自定义字段和关系”相关列表中,单击 New.
  8. 选择 Text, 然后单击 Next.
  9. 对于字段标签/名称,输入 Location.
  10. 对于“长度”,请键入100.保留其他字段的默认值,并将“说明”字段保留为空。点击 Save.
  11. 按照步骤7,8和9添加下两个字段:
    字段标签/名称 字段类型
    Urgent Checkbox
    News Content Text Area (Long)

对于您刚定义的Cloud News事件,您创建了各种类型的字段,如文本字段或复选框。平台事件支持的所有字段类型是:

  • Checkbox
  • Date
  • Date/Time
  • Number
  • Text
  • Text Area (Long)

事件保留和ReplayId系统字段

Salesforce将平台事件存储24小时。您可以检索API CometD客户端中存储的事件,但不能检索Apex中的事件。您可以检索所有存储的事件,也可以将事件的重播ID指定为检索事件的基线。

即使Salesforce暂时保留事件记录,也不能通过SOQL或SOSL查询它们。同样,您不能在报告,列表视图和搜索中的用户界面中使用事件记录。只有在订购CometD和使用ReplayId选项时才能检索过去的事件。我们向您展示如何订阅下一单元的活动。

每个事件消息被分配一个包含在ReplayId字段中的不透明ID。由系统填充的ReplayId字段值指的是事件流中事件的位置。重放ID值不保证连续事件连续。例如,ID为999的事件之后的事件可以具有1,025的ID。订阅者可以存储重播ID值并在重新订阅时使用它来检索保留窗口内的事件。例如,用户可以在连接失败后检索错过的事件。订阅者不得根据存储的重播ID来计算新的重播ID,以引用流中的其他事件。

API名称后缀

在创建平台事件时,系统会附加__e后缀来创建事件的API名称。例如,对于Cloud News事件,API名称是Cloud_News__e。只要以编程方式引用该事件,请使用API​​名称,例如,在Apex,REST API和Enterprise API中。

发布事件

如果您的应用程序位于Salesforce平台上,则可以使用Apex方法或声明性工具(如Process Builder或Cloud Flow Designer)发布事件。如果您的应用是外部应用,则可以使用Salesforce API发布事件。

使用Apex发布事件消息

要发布事件消息,请创建事件的实例并将其传递给EventBus.publish方法。

以下示例创建一个类型为Cloud_News__e的事件,将其发布,然后检查发布是成功还是遇到错误。 EventBus.publish()方法返回一个Database.SaveResult对象,其中包含发布的结果。如果isSuccess()返回true,则事件已在Salesforce事件总线中发布。否则,该事件遇到在Database.Error对象中返回的错误。

// 创建一个事件的实例并将其存储在newsEvent变量中
Cloud_News__e newsEvent = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=true, 
           News_Content__c='Lake Road is closed due to mudslides.');

// 调用方法来发布事件
Database.SaveResult sr = EventBus.publish(newsEvent);

// 检查发布结果
if (sr.isSuccess()) {
    System.debug('Successfully published event.');
} else {
    for(Database.Error err : sr.getErrors()) {
        System.debug('Error returned: ' +
                     err.getStatusCode() +
                     ' - ' +
                     err.getMessage());
    }
}
要在同一个调用中发布多个事件,请将您的事件添加到事件列表中,然后将该列表传递给EventBus.publish()方法。此方法的输出是Database.SaveResult对象的数组:每个发布的事件一个。 EventBus.publish()可以发布一些传入事件,即使由于错误而无法发布其他事件。 EventBus.publish()方法不会因发布操作失败而引发异常。在使用部分成功选项调用时,它的行为类似于Apex Database.insert()方法。
// List来保存要发布的事件对象。
List<Cloud_News__e> newsEventList = new List<Cloud_News__e>();
// 创建事件对象
Cloud_News__e newsEvent1 = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=true, 
           News_Content__c='Lake Road is closed due to mudslides.');
Cloud_News__e newsEvent2 = new Cloud_News__e(
           Location__c='Mountain City', 
           Urgent__c=false, 
           News_Content__c='Small incident on Goat Lane causing traffic.');
// 将事件对象添加到列表中。
newsEventList.add(newsEvent1);
newsEventList.add(newsEvent2);

// 调用方法来发布事件。
List<Database.SaveResult> results = EventBus.publish(newsEventList);

// 检查每个事件的发布结果
for (Database.SaveResult sr : results) {
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                        err.getStatusCode() +
                        ' - ' +
                        err.getMessage());
        }
    }       
}

注意

Salesforce平台对您可以在组织中定义的事件数量以及您可以在一个小时内发布的事件记录数量进行限制。此外,由于事件发布相当于DML插入操作,所以适用DML限制和其他Apex调控限制。有关平台事件限制和Apex调控器限制的更多信息,请参阅参考资料部分。

使用点击发布事件消息

要发布没有代码的事件消息,请在流程或流程中使用记录创建功能。

此屏幕截图显示了在发布Cloud News事件消息的Process Builder中创建记录操作的示例。基本上,将“记录类型”设置为要发布的平台事件(云新闻),然后设置事件的值。

The Create a Record action in Process Builder is set to the Cloud News record type. The fields of the Cloud News event are filled.

同样,您可以使用流发布平台事件消息。配置Record Create元素以创建平台事件(Cloud_News__c)的实例,然后设置事件的值。要设置布尔字段的值(如Urgent__c),请使用{!$ GlobalConstant.True}。

使用Salesforce API发布事件消息

外部应用使用API​​发布平台事件消息。您可以像插入sObjects一样创建事件记录来发布事件。您可以使用Salesforce API来创建平台事件记录,如SOAP API,REST API或Bulk API。

例如,对于Cloud News事件,您可以通过插入Cloud_News__e记录来发布事件通知。以下示例在REST API中创建一个类型为Cloud_News__e的事件。

sObject REST端点:

/services/data/v40.0/sobjects/Cloud_News__e/
POST请求的请求主体:
{
   "Location__c" : "Mountain City",
   "Urgent__c" : true,
   "News_Content__c" : "Lake Road is closed due to mudslides."
}
平台事件记录创建后,REST响应看起来像这个输出。为了简洁,标题被删除。
HTTP/1.1 201 Created 

{   
   "id" : "e00xx000000000B",
   "success" : true,
   "errors" : [ ],
   "warnings" : [ ] 
}
您可以使用任何REST API工具或HTTP客户端应用程序来进行REST API调用。例如,您可以按照以下步骤使用Workbench。
  1. 登录到您的Trailhead DE组织。
  2. 打开一个新标签页并导航到Workbench https://workbench.developerforce.com/login.php
  3. 对于环境,请选择 Production.
  4. 对于API版本,请选择可用的最高编号。
  5. 选择 I agree to the terms of service.
  6. 点击 Login with Salesforce.
  7. 在下一个屏幕上,单击 Allow.
  8. 在顶部菜单中,选择 utilities | REST Explorer.
  9. 点击 POST.
  10. 将URI替换为:
    /services/data/v40.0/sobjects/Cloud_News__e
  11. 对于请求正文,以JSON格式添加以下正文。
    {
       "Location__c" : "Mountain City",
       "Urgent__c" : true,
       "News_Content__c" : "Lake Road is closed due to mudslides."
    }
  12. 点击 Execute.

    Salesforce在发布事件后返回的响应类似于以下内容。

    {
      "id" : "e00xx0000000001AAA",
      "success" : true,
      "errors" : [ ],
      "warnings" : [ ]
    }
    
    或者,您可以通过create()调用或在Bulk API中使用批处理作业在SOAP API中发布事件。

平台事件和事务

与自定义对象不同,平台事件不在Salesforce平台的数据库事务中处理。 因此,发布的平台事件无法回滚。 请注意以下几点:

  • 当您通过API发布平台事件时,allOrNoneHeader API标头将被忽略。
  • 平台事件不支持Apex setSavepoint()和rollback()数据库方法。

当您发布平台事件时,适用DML限制和其他Apex调控限制。

现在你已经看到了如何定义和发布事件,让我们看看如何订阅它们!

Apex-事件驱动(1)

学习目标

完成本单元后,您将能够:

  • 列出基于事件的软件体系结构的组件。
  • 解释一个事件驱动的软件架构的好处。
  • 描述平台事件功能的用例。
  • 描述平台事件的特征。

了解事件驱动的软件体系结构

您的订单系统是否有包裹?打印机墨盒是否需要更换?无论您希望得到什么通知,Salesforce企业消息传递平台都可以在Salesforce内部和外部来源提供安全且可扩展的自定义通知。通过平台事件,您可以监视系统并将更改传达给其他系统。

注意

如果尚未完成,请先完成API基础模块,然后再使用该模块。熟悉Streaming API的概念是此模块的先决条件。

基于事件的沟通的范例围绕发布者 – 订阅者模型展开 – 发送者广播一个或多个接收者捕获的消息。这就像无线电传输 – 发射塔发射无线电信号,接收机获得信号,如果他们调整到正确的频率。

就像无线电传输一样,基于事件的通信从发送者流向接收者。无论接收者是否正在侦听,事件都会被发送,接收者在收到事件时不会确认。基于事件的通信可以实时进行,或者更准确地说,可以近乎实时地进行。无线电波以光速行进,但基于事件的软件和硬件系统通常有一些延迟。非必要的披露:Salesforce速度很快,但速度不及光速!

在API基础模块中,我们使用海盗船上雷达的类比来表示事件检测。这个类比适用于基于Salesforce记录更改的PushTopic事件流。该通信模型只需要一个用户。但是对于平台事件,通信有两方:发送方和接收方。它们是事件驱动架构的两个组成部分。

事件驱动系统的组件

在我们继续之前,让我们定义一些术语。

Event
在业务流程中有意义的状态变化例如,采购订单的放置是一个有意义的事件,因为订单履行中心希望在处理订单前收到通知。
Event message
包含有关事件数据的消息。也被称为事件通知。例如,事件消息可以是关于包含关于订单的信息的订单放置的通知。
Event producer
通过频道发布事件消息。例如,一个订单放置应用程序。
Event channel
事件生成器发送事件消息和事件消费者读取这些消息的事件流。在Salesforce中也称为事件总线。
Event consumer
从频道接收讯息的频道的订阅者。例如,通知新订单的订单履行应用程序。

下图说明了一个基于事件的软件体系结构。

A diagram showing components of event-based systems: event producers, which feed information into the event bus, which sends messages to the event consumers

与请求响应通信模型不同,基于事件驱动模型的软件架构将事件生成者与事件消费者分离,从而简化了连接系统中的通信模型。不需要向服务器请求获取关于某个状态的信息。相反,系统订阅事件通道,并在新状态发生时通知。任何数量的消费者都可以接收和响应相同的事件。当事件发生时,系统会获得这些信息,并可以近乎实时地对其作出反应。除了消息内容的语义之外,发送事件的系统和接收事件的系统彼此之间没有依赖关系。

Salesforce企业消息传递平台提供事件驱动软件体系结构的好处。平台事件是您的应用程序发送和接收的事件消息。它们简化了沟通变化和响应变化的过程,而无需编写复杂的逻辑。发布者和订阅者通过平台事件相互通信。一个或多个用户可以听相同的事件并执行操作。

假设一家名为“云新闻”的新闻机构向订阅的客户发送活动信息,以及有关山区撤退目的地的交通和道路状况的最新突发消息。这些事件的内容不仅仅是新闻事件本身,还包括新闻是否紧急以及事件的发生地点等相关细节。用户可以接收这些事件,并根据新闻的紧急性确定要采取的行动。

所有这一切听起来都不错,但是当你可以使用平台事件时,真实情况是什么呢?当然,平台活动的使用不限于新闻机构。以下是一些有用的应用程序。

何时使用平台事件的示例

我们来看看使用平台事件的一些业务场景。在这些情况下,Salesforce和外部系统通过平台事件消息进行通信。在第一种情况下,Salesforce中的应用程序通知产品装运订单的外部订单履行应用程序。在第二种情况下,外部产品应用程序通知Salesforce商品退货。最后一个场景显示了如何使用触发器在Salesforce中使用事件消息。

平台到外部应用程序:订单履行供应商应用程序

当Salesforce关闭一个机会时,您的公司已经赢得了与客户的交易。假设您使用供应商来运送与机会相关的产品。每个供应商都有一个处理装运订单的外部应用。外部应用程序监听平台事件。当机会关闭时,作为Salesforce产品订购应用程序一部分的触发器会触发并发布平台事件消息。每个供应商应用程序都会收到有关该事件的通知,并为特定产品创建装运订单。

In this diagram, a product order app publishes an order event to an event bus. Various vendor apps subscribe to the event bus and receive the event.

平台应用程序的外部应用程序:处理Salesforce中的商品退货

比方说,有人想把购买的商品退还给供应商。外部系统将商品退货请求发送给Salesforce进行处理。外部系统发布平台事件以提醒Salesforce返回商品。 Salesforce中的事件侦听器(触发器)接收事件并执行一些操作。例如,触发器可能会提醒销售代表退货,并向客户发送确认电子邮件。

An external vendor app publishes a platform event message for a merchandise return request. In Salesforce, a trigger subscribes to the event bus and receives the event.

平台到平台:重新分配主要记录

在Salesforce中分配销售线索时,销售线索触发器会触发并检查与销售线索所有者相关的未决商机和案例。根据相关记录,触发器发布由Salesforce应用程序接收的事件。根据事件信息,应用程序将重新分配潜在客户并创建一个Chatter帖子。

在这种情况下,您可以使用其他Salesforce功能执行相同的操作,例如Process Builder或流程。但是通过使用平台事件,您可以从基于事件的编程模型和跨应用程序的标准编程方式中受益。

In this diagram, an app in Salesforce publishes a platform event. A trigger subscribes to this event channel and receives the event.

平台事件特征

现在您已经了解了何时使用平台事件,让我们深入了解其组件和特性。

您可以定义平台事件包含的自定义数据。就像自定义对象一样,您可以在Salesforce中定义平台事件。通过给它一个名称并添加自定义字段来创建一个平台事件定义。以下是云新闻社新闻事件的自定义字段的示例定义。

字段标签/名称 字段API名称 字段类型
Location Location__c Text

Length: 100

Urgent Urgent__c Checkbox
News Content News_Content__c Text Area (Long)

平台事件和sObjects

平台事件是一种特殊的Salesforce实体,在很多方面与sObject类似。事件消息是平台事件的实例,类似于记录是自定义对象的实例。与自定义对象不同,您不能更新或删除事件记录,也不能在Salesforce用户界面中查看事件记录。

您可以设置读取和创建平台事件的权限。您向配置文件或权限集中的用户授予权限。

在本机和外部应用程序中使用平台事件

平台事件支持Salesforce内部和外部应用程序中的事件消息流。 Salesforce平台上的应用程序使用Apex方法发布事件,并使用Apex触发器来消费事件。此外,Visualforce和Lightning组件应用程序可以使用CometD订阅事件。作为代码的替代方法,您可以使用声明性工具(如Process Builder和Cloud Flow Designer)发布事件。最后,外部应用程序使用sObject API发布事件,并使用CometD客户端消费事件。如您所见,在选择使用平台事件方面有很大的灵活性!

平台事件和其他流式事件之间的差异

其他流媒体事件呢?其他事件包括PushTopic和通用事件。借助PushTopic事件,客户端将根据预定义的查询接收有关Salesforce记录更改的消息。使用通用事件,您可以发送和接收任意消息内容(有效内容),而不一定与Salesforce记录绑定。平台事件与通用事件类似,但提供更强大的自定义功能。借助平台事件,您可以发布任何自定义数据。您可以将粒度级别的事件数据模式定义为键入的字段。另外,您可以在本地Salesforce平台应用程序和外部应用程序中使用平台事件。在以下情况下使用平台事件:

  • 使用预定义模式发送和接收自定义事件数据
  • 发布或订阅Apex中的活动
  • 为了在Salesforce平台上和以外发布和处理事件的灵活性该表比较了一般事件和平台事件的特征。

功能通用事件平台事件

特征 通用事件 平台事件
将事件模式定义为类型字段 Check mark
包含用户定义的有效载荷 Check mark Check mark
通过一个或多个API发布事件 Check mark Check mark
通过Apex发布活动 Check mark
通过CometD订阅 Check mark Check mark
通过Apex触发器订阅 Check mark
使用Process Builder以声明方式发布并流动复选标记 Check mark

在下一个单元中,我们将定义一个平台事件并发布事件。

Apex 异步(6)监视异步

学习目标

完成这个单位后,你会知道:

  • 如何监控不同类型的工作。
  • 如何使用弹性队列。

监视异步作业

异步工作的好处是他们在后台默默地工作。异步工作的难点在于他们在后台默默工作。幸运的是,有几种方法可以监视你的工作内容。

您可以监视Salesforce用户界面中所有作业的状态。从安装程序中,在快速查找框中输入作业,然后选择Apex作业。

Apex Jobs页面显示所有异步Apex作业,其中包含有关每个作业执行的信息。以下屏幕截图显示了同一个Batch Apex类的一个未来方法作业和两个已完成的批处理作业。

Apex Jobs

如果您有许多批处理作业,请使用“批处理作业”页面仅查看批处理作业。要打开“Apex批处理作业”页面,请单击“Apex作业”页面顶部的链接。使用“Apex批处理作业”页面中的滑块选择特定的日期范围,并缩小显示的批处理作业的列表。您可以查看过去尚未删除的作业。 “批处理作业”页面按批处理类别对作业进行分组。

Apex Batch Jobs

点击您感兴趣的课程ID旁边的“更多信息”,查找有关为该课程执行的作业的详细信息。此图像显示单击“更多信息”后显示的弹出窗口。这个批次类有两个成功执行的作业。

information about parent jobs

您还可以监视Apex Flex队列中Apex作业的状态,并对其进行重新排序以控制首先处理哪些作业。从“设置”中,在“快速查找”框中输入作业,然后选择 Apex Flex Queue.

监测Future Jobs

Future jobs就像任何其他工作一样出现在Apex工作页面上。但是,未来的工作目前不属于灵活队列的一部分。

你可以查询AsyncApexJob找到你未来的工作,但有一个警告。由于启动未来作业不会返回ID,因此您必须过滤其他字段(如MethodName或JobType)以查找您的作业。在这个Stack Exchange文章中有几个示例SOQL查询可能会有所帮助。

使用SOQL监视Queued Jobs

要查询有关您提交的作业的信息,请通过筛选System.enqueueJob方法返回的作业ID,在AsyncApexJob上执行SOQL查询。

AsyncApexJob jobInfo = [SELECT Status, NumberOfErrors
    FROM AsyncApexJob WHERE Id = :jobID];

使用Flex队列监视Queue Jobs

Apex Flex队列使您能够提交多达100个批处理作业执行。任何提交执行的作业都处于保持状态,并放置在Apex Flex队列中。最多可以有100个批处理作业处于保持状态。

按照先进先出的顺序处理作业。您可以查看当前的队列顺序并将其排列,以便将重要的工作移到前面,或者将重要的工作移到后面。

当系统资源可用时,系统从Apex Flex队列的顶部选取下一个作业,并将其移至批处理作业队列。系统可以为每个组织同时处理最多五个排队或活动作业。这些已移动作业的状态从“保持”更改为“已排队”。排队的作业在系统准备好处理新作业时被执行。像其他作业一样,您可以在Apex Jobs页面中监控排队的作业。

监视Scheduled Jobs

在计划完Apex作业之后,您可以通过在CronTrigger上运行SOQL查询来获得更多关于它的信息。以下示例查询作业运行的次数以及计划再次运行作业的日期和时间。它使用从System.schedule方法返回的jobID变量。

CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :jobID];
如果您在可调度类的execute方法内部执行此查询,则可以通过调用SchedulableContext参数变量上的getTriggerId来获取当前作业的ID。
global class DoAwesomeStuff implements Schedulable {

    global void execute(SchedulableContext sc) {
        // 一些很棒的代码
        CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :sc.getTriggerId()];
    }
    
}
您还可以从与CronTrigger记录关联的CronJobDetail记录中获取作业的名称和作业的类型。为此,请在CronTrigger上执行查询时使用CronJobDetail关系。本示例使用CronJobDetail中的作业名称和类型来检索最新的CronTrigger记录。
CronTrigger job = [SELECT Id, CronJobDetail.Id, CronJobDetail.Name, CronJobDetail.JobType FROM CronTrigger ORDER BY CreatedDate DESC LIMIT 1];
或者,您可以直接查询CronJobDetail以获取作业的名称和类型。 以下示例获取上例中查询的CronTrigger记录的作业名称和类型。 相应的CronJobDetail记录标识由CronTrigger记录上的CronJobDetail.Id表达式获取。
CronJobDetail ctd = [SELECT Id, Name, JobType FROM CronJobDetail WHERE Id = :job.CronJobDetail.Id];
最后,要获取所有Apex计划作业的总计数(不包括所有其他计划作业类型),请执行以下查询。 请注意,值“7”是为作业类型指定的,该作业类型对应于预定的Apex作业类型。 请参阅参考资料部分中的CronJobDetail,了解所有类型的列表。
SELECT COUNT() FROM CronTrigger WHERE CronJobDetail.JobType = '7