2

Salesforce は、1 つの SOAP メッセージ内で最大 100 件の要求を送信できます。このタイプの Bulk Ooutbound メッセージ要求を送信しているときに、PHP スクリプトは実行を終了しますが、SF は、Salesforce 側でメッセージ キューをクリアするために使用される ACK を受け入れることができません。アウトバウンド メッセージ ログ (監視) を見ると、すべてのメッセージが保留状態で、配信失敗の理由が "java.net.SocketTimeoutException: Read timed out" であることがわかります。スクリプトの実行が終了しているのに、なぜこのエラーが発生するのですか?

Salesforce側にアクセスできないため、サーバーでの実行時間を増やすためにこれらの方法を試しました。

  • set_time_limit(0); // スクリプト内
  • max_execution_time = 360 ; 各スクリプトの最大実行時間 (秒単位)
  • 最大入力時間 = 360 ; 各スクリプトがリクエスト データの解析に費やす最大時間
  • メモリ制限 = 32M ; スクリプトが消費するメモリの最大量

テストのためだけに高い設定を使用しました。

なぜこれが Salesforce への ACK 配信に失敗するのかについて何か考えはありますか?

コードの一部を次に示します。これは、着信する 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 サイトでいくつかの情報を見つけましたが、まだ運がありません。ここにリンクがあります。

また、PHP Toolkit 11 (Salesforce から) を使用しています。

優れた SF ヘルプを備えた他のフォーラム

これについての洞察に感謝します、 --Phill

アップデート:

着信メッセージを受信して​​応答を出力した場合、後で何かを行うかどうかに関係なく、これを最初に行う必要がありますか? それとも、プロセスが終了するのを待ってから応答を出力しますか?

更新#2:

OK、問題があると思います。PHP はシングル スレッド処理アプローチを使用しており、スレッドが処理を完了するまで ACK ファイルを送り返しません。これをマルチスレッドプロセスにする方法はありますか? スレッド #1 - 着信 SOAP 要求を受け入れて ACK を送り返す スレッド #2 - SOAP 要求を処理する

DBテーブルやフラットファイルのように分割できることは知っていますが、それを行わずにこれを達成する方法はありますか?

ACK送信後にソケットを閉じて処理を続行しようとしていますが、うまくいくと思います。

4

5 に答える 5

1

送信メッセージがタイムアウトしているようです。他のユーザーは、10 秒という短いタイムアウトを報告しています (以下のフォーラム リンクを参照)。私が使用しているサンドボックス インスタンス (cs1) は、テストから約 1 分後にタイムアウトします。タイムアウトは、Salesforce が制御する組織またはインスタンス レベルの設定である可能性があります。

あなたが試すことができる2つのこと:

  1. Salesforce でサポート チケットを開いて、送信メッセージのタイムアウト値を増やすことができるかどうかを確認してください。私の経験から、組織レベルで変更できる設定はたくさんあります。これはその 1 つかもしれません。

  2. ACK がすぐに Salesforce に返されるように、データの処理をオフロードします。その後、データの実際の処理は非同期で行われます。すなわち。メッセージキュー、別スレッドなど

役立つその他のリソース:

関連する Salesforce フォーラムのディスカッション

アウトバウンド メッセージのドキュメント

于 2010-03-22T21:22:42.190 に答える
1

あなたのスクリプトが終了するのを待っていることをタイムアウトさせていると思います。

これを修正する方法があります。

最初にackメッセージを含むエンベロープを出力し、処理を終了する前にサーバーがそれを取得できるようにフラッシュします。スレッド化はなく、単純な優先順位を再考するだけです:)

コンテンツのフラッシュに関する最良の情報については、これをお読みください

于 2010-03-26T10:26:38.167 に答える
0

だから私がやったことは次のとおりです。

  1. すべての着信 OBM を受け入れ、DB に解析します
  2. これが完了すると、バックグラウンドで実行されるプロセスが開始されます (実際には、スクリプトを終了できるようにプロセスをバックグラウンドに送信します)
  3. ACKファイルを送り返す

生データを受け入れるだけで、フィールドへの解析と DB への挿入がかなり迅速に行われます。次に、バックグラウンドで実行する処理スクリプトも送信する Linux コマンド ライン コマンドを発行します。次に、ACK ファイルを SF に送信すると、スクリプトは割り当てられた時間内に終了します。スクリプト プロセスを 2 つの別々の段階に分割するのは面倒ですが、機能します。

于 2010-09-10T18:31:55.537 に答える
0

スクリプトの実行に必要な時間だけ、Salesforce が待機することを 100% 確信していますか? 80 秒は私にとっては長い時間のように思えます。

すべてのリクエストが失敗した場合、Salesforce はヘッダーを適切に設定することを期待していると思いますContent-Typeが、そうではないようです。

于 2010-03-18T19:32:58.800 に答える
0

Salesforce については知りませんが、PHP でマルチスレッドを作成したい場合は、このコード例を見てください。より正確にはpcntl_fork()を見てください。

注意: pcntl はデフォルトでは有効になっておらず、Windows プラットフォームでは動作しません。

于 2010-03-29T11:30:03.057 に答える