2017-08-17 48 views
0

我正在为高流量应用程序进行Salesforce集成,我们希望能够自动将记录从Salesforce导入到我们的应用程序。为了清楚起见,我并非从Salesforce方面(即Apex)开展工作,而是从其他应用程序中使用Salesforce Rest API。我如何轮询Salesforce API以查找符合条件并且之前未被我的应用程序看到的记录?

第一个想法是使用创建记录时的截止时间,根据申请人在上次投票中的创建时间,我们将增加每次投票的时间。很快就意识到这不适用于此。查询中可能包含其他过滤器,这些过滤器可能包含Salesforce中的状态字段,例如,记录只应在设置特定状态后才导入。这会使检查创建时间或类似的不可靠,因为较旧的记录可能以后与我们的自动导入相关。

我的下一个想法是轮询Salesforce API来每隔几个小时查找一次记录。为了避免输入相同的记录两次,只有这样我能想到这样做是保持我们已经尝试导入的ID的跟踪和使用这些做一个NOT IN条件:

SELECT #{columns} FROM #{sobject_name} 
WHERE Id NOT IN #{ids_we_already_imported} AND #{other_filters} 

我的大此时关注的是Salesforce是否对WHERE子句的长度有限制。通过一些研究,我看其实有几个限制:

https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_soslsoql.htm

我认为接下来的事情在做查询,找到所有在Salesforce满足其他过滤条件的ID的不检查ID本身。然后,我们可以将这个ID列表删除,并删除我们已经在我们的末尾追踪到的那个,以找到一个更小的IN条件,我们可以设置它来查找我们实际需要的记录上的所有数据。

虽然这仍然不是很可靠。我看到一个查询只能返回2000行,只有2000的偏移量。如果我们已经导入了2000条记录,第一条查询可能没有我们想要导入的任何必要的行,但是我们无法抵消它以得到相关的行因为这些限制。

有了这些限制,我无法找到一种可靠的方式来查找相关记录,以导入我们已经导入的记录数增长的相关记录。我觉得这是Salesforce集成的常见用法,但我无法找到任何相关信息。我们如何做到这一点,而不必担心我们达到高产量时的问题?

+0

对查询没有2000限制,将返回前2000行,但您可以通过获取nextRecordsUrl字段值来访问其余行[ – superfell

+0

]谢谢!我不知道有一种内置的方式来获得查询结果的其余部分!这肯定会允许我上面解释的计划工作。 – mikewoj

回答

0

不确定你的所有要求是什么,或者如果解决方案需要是通用的,但你可以做一些事情。已导入

  1. 标志的记录,但是这意味着在打电话回Salesforce来更新记录,但可以bulkified减少呼叫的数量和修改查询来排除标志
  2. 反向您的数据推送方式而非拉取方式,因此只要记录符合工作流程和出站邮件的标准,salesforce就会推送符合条件的记录
  3. 使用流API可以设置应用程序推送主题可以订阅,当记录符合条件时将得到通知
+0

解决方案2与3不同?有没有办法让Salesforce在我们的终端上调用webhook? – mikewoj

+0

解决方案2将是salesforce中的工作流规则,只要记录符合指定的条件,它就会向您选择的端点发送出站消息(认为SOAP消息)。解决方案3是一个推送主题(思考长轮询),您的应用程序将订阅推送主题频道并监听更改。通道采用SOQL语句,因此每当记录更改以符合SOQL中指定的条件时,就会向订阅客户端发送一条消息,其中包含详细信息。选项3主要围绕大量更改同时存在一些限制。 –

相关问题