Salesforce可以在1条SOAP消息中发送最多100个请求。在发送此类型的Bulk Ooutbound消息请求时,我的PHP脚本完成执行,但SF无法接受用于清除Salesforce端消息队列的ACK。查看Outbound消息日志(监视),我看到所有处于挂起状态的消息都带有Delivery Failure Reason“java.net.SocketTimeoutException:read timed out”。如果我的脚本已完成执行,为什么会出现此错误?
我尝试过这些方法来增加服务器上的执行时间,因为我无法访问Salesforce端:
我使用高设置进行测试。
为什么这会导致ACK交付给Salesforce失败?
以下是一些代码: 这就是我接受并发送即将发送的SOAP请求的ACK文件
的方法$data = 'php://input';
$content = file_get_contents($data);
if($content) {
respond('true');
} else {
respond('false');
}
回复功能
function respond($tf) {
$ACK = <<<ACK
<?xml version = "1.0" encoding = "utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<notifications xmlns="http://soap.sforce.com/2005/09/outbound">
<Ack>$tf</Ack>
</notifications>
</soapenv:Body>
</soapenv:Envelope>
ACK;
print trim($ACK);
}
这些是我在脚本中包含的通用脚本,该脚本使用特定工作流的数据。我可以处理大约25个请求(这是在1个SOAP响应中)但是一旦我查看,我在Salesforce队列中得到超时错误。 50个请求通常需要我的PHP脚本86.77秒。
可能是Apache吗? PHP?
我还测试过只接受100个请求SOAP响应,只是接受并发送队列清除的ACK,所以我知道这是我自己的事情。
我在apache日志中没有显示错误,脚本运行正常。
我确实在Salesforce网站上找到了一些信息,但仍然没有运气。这是the link。
我也在使用PHP Toolkit 11(来自Salesforce)。
感谢您对此有任何见解, --Phill
更新:
如果我收到收到的消息并打印回复,那么不管我之后做了什么,我都会先发生这种情况吗?还是等待我的流程完成然后打印响应?
更新#2:
好吧我觉得我有问题: PHP使用单线程处理方法,并且在线程完成处理之前不会发回ACK文件。有没有办法使这成为一个多线程进程? 线程#1 - 接受传入的SOAP请求并发回ACK 线程#2 - 处理SOAP请求
我知道我可以将其分解为数据库表或平面文件,但有没有办法在不这样做的情况下实现这一目标?
在ACK提交后我将尝试关闭套接字并继续处理,交叉指示它会起作用。
答案 0 :(得分:1)
听起来出站消息正在超时。其他用户报告的暂停时间低至10秒(请参阅下面的论坛链接)。我使用的沙箱实例(cs1)在我的测试后约1分钟后超时。超时可能是Salesforce控制的组织或实例级别设置。
你可以尝试两件事:
打开支持票证 Salesforce看看他们是否可以 增加超时值 出站邮件。从我的 经验,有很多 他们可以修改的设置 组织级别 - 这可能是 其中之一。
卸载您的数据处理,所以 ACK立即发送 回到Salesforce。那么实际 处理您的数据将需要 异步地放置。即。信息 队列,单独的线程等
其他一些可能有用的资源:
答案 1 :(得分:1)
我认为他们会等待你的脚本结束。
有一种方法可以尝试解决这个问题。
在开头输出带有ack消息的信封,然后刷新物品,以便他们的服务器在您结束处理之前获取它。没有线程,只是重新考虑的优先事项:)
答案 2 :(得分:0)
您是否100%确定Salesforce会等待脚本运行所需的时间? 80秒似乎也是我的时间。
如果所有请求都失败了,我猜想Salesforce希望您适当地设置Content-Type
标头,但似乎并非如此。
答案 3 :(得分:0)
我不了解Salesforce,但是如果你想用PHP进行多线程处理,你应该看看this code example,更准确地说是pcntl_fork()。
N.B:默认情况下,pcntl 不,并且无法在Windows平台上运行。
答案 4 :(得分:0)
所以我所做的是:
通过接受原始数据,解析到字段并将其插入到数据库中相当快。然后我发出一个Linux命令行命令,该命令也发送处理脚本以在后台运行。然后我将ACK文件发送到SF,脚本在指定的时间内结束。将脚本过程分成两个单独的阶段是很麻烦的,但它可以工作。