java - Salesforce/PHP - 批量出站消息 (SOAP),超时问题 - 请参阅更新 #2

标签 java php soap timeout salesforce

Salesforce 最多可以在 1 条 SOAP 消息中发送 100 个请求。在发送此类批量 Ooutbound 消息请求时,我的 PHP 脚本完成执行,但 SF 无法接受用于清除 Salesforce 端消息队列的 ACK。查看出站消息日志(监控),我看到所有消息都处于挂起状态,传递失败原因为“java.net.SocketTimeoutException:读取超时”。如果我的脚本已完成执行,为什么会出现此错误?

我已经尝试了这些方法来增加我服务器上的执行时间,因为我无法访问 Salesforce 端:

  • 设置时间限制(0);//在脚本中
  • 最大执行时间 = 360 ;每个脚本的最大执行时间,以秒为单位
  • 最大输入时间 = 360 ;每个脚本可能花在解析请求数据上的最长时间
  • 内存限制 = 32M ;脚本可能消耗的最大内存量

我使用高设置只是为了测试。

对于将 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)。

Other forum with good SF help

感谢您对此的任何见解, --菲尔

更新:

如果我收到传入消息并打印响应,是否应该先发生这种情况,而不管我之后是否做任何其他事情?还是等待我的过程完成然后打印响应?

更新#2:

好的,我想我遇到了问题: PHP 使用单线程处理方法,在线程完成处理之前不会发回 ACK 文件。有没有办法使它成为一个多线程进程? 线程 #1 - 接受传入的 SOAP 请求并发回 ACK 线程 #2 - 处理 SOAP 请求

我知道我可以将其分解成数据库表或平面文件,但有没有办法在不这样做的情况下完成此操作?

我将尝试在 ACK 提交后关闭套接字并继续处理,祈祷它会起作用。

最佳答案

听起来出站消息超时了。其他用户报告超时低至 10 秒(请参阅下面的论坛链接)。根据我的测试,我使用的沙箱实例 (cs1) 在大约 1 分钟后超时。超时可能是 Salesforce 控制的组织或实例级别设置。

您可以尝试两件事:

  1. 使用 Salesforce 看看他们是否可以 增加超时值 出站消息。从我的 经验,有很多 他们可以修改的设置 组织级别 - 这可能是 其中之一。

  2. 卸载数据处理,因此 立即发送ACK 回到 Salesforce。那么实际的 处理您的数据需要 异步放置。 IE。信息 队列、独立线程等

一些其他可能有用的资源:

related Salesforce forum discussion

Outbound messaging documentation

关于java - Salesforce/PHP - 批量出站消息 (SOAP),超时问题 - 请参阅更新 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472746/

相关文章:

java - 在 Java EE 6 Web 应用程序中登录用户的不同方式

java - 无法访问内部类的公共(public)变量...这是从父级继承的

php - 在我的部分页面上使用 Php 到 "No cache"的方法?

asp.net - Web 服务开发从哪里开始?

java - 在实例化子类之前检查子类的相关性?

java - 泛型方法参数的类型

PHP cookie、 session 、mysql

php - php Youtube从live_stream获取视频ID

PHP Soap 服务器响应格式

php - 如何使用 Web 服务将 Joomla 登录 session 从一个网站共享到另一个网站?