Frage

Salesforce kann bis zu 100 Anfragen innerhalb 1 SOAP-Nachricht senden. Während diese Art von Massen Ooutbound Nachricht sendet anfordern mein PHP-Skript beendet die Ausführung aber SF schlägt die ACK akzeptieren verwendet, um die Nachrichten-Warteschlange auf der Salesforce-Seite der Dinge zu löschen. Mit Blick auf dem Outbound Nachrichtenprotokoll (Überwachung) ich alle Nachrichten in einem wartenden Zustand zu sehen mit der Lieferung Failure Reason „java.net.SocketTimeoutException: Read timed out“. Wenn mein Skript fertig Ausführung hat, warum bekomme ich diesen Fehler?

Ich habe diese Methoden versucht, die Ausführungszeit auf meinem Server zu erhöhen, da ich keinen Zugriff auf die Seite haben Salesforce:

  • set_time_limit (0); // im Skript
  • max_execution_time = 360; Maximale Ausführungszeit jedes Skript, in Sekunden
  • max_input_time = 360; Die maximale Menge an Zeit jedes Skript ausgeben können Anforderungsdaten Parsen
  • memory_limit = 32M; Die maximale Menge an Speicher ein Skript verbrauchen

ich verwenden, um die hohen Einstellungen nur für den Test.

Alle Gedanken, warum dies die ACK Lieferung zurück zu Salesforce versagt?

Hier ist ein Teil des Codes: Dies ist, wie ich übernehmen und die ACK-Datei für die 'Incoming' SOAP-Anforderung senden

$data = 'php://input';
$content = file_get_contents($data);

if($content) {
    respond('true');
} else {
    respond('false');
}

Die respond Funktion

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); 
}

Diese sind in einem allgemeinen Skript, dass ich in das Skript enthalten, die die Daten für einen bestimmten Workflow verwendet. Ich kann über 25 Anfragen (das ist in 1 SOAP-Antwort) verarbeiten, aber wenn ich gehe, dass ich die Timeout-Fehler in der Warteschlange bekommen Salesforce. 50 Anfragen wird dauert in der Regel meines PHP-Skript 86,77 Sekunden.

Könnte es Apache sein? PHP?

Ich habe auch nur die Annahme des 100 Anfrage SOAP-Antwort und nur die Annahme und das Senden der ACK der Warteschlange heraus löscht getestet, so dass ich es auf meiner Seite der Dinge wissen.

Ich zeige keine Fehler im Apache-Log, das Skript läuft gut.

Ich habe einige Informationen über die Salesforce-Website finden, aber noch kein Glück. Hier ist der Link .

Auch verwende ich den PHP-Toolkit 11 (von Salesforce).

Andere Forum mit guter SF Hilfe

Vielen Dank für jede Einsicht in diese, --Phill

UPDATE:

Wenn ich die eingehende Nachricht empfangen und die Antwort drucken, sollte dies passieren zunächst unabhängig davon, ob ich etwas anderes tun nach? Oder macht es für meinen Prozess bis zum Ende warten und dann die Antwort drucken?

UPDATE # 2:

okay, ich glaube, ich habe das Problem: PHP verwendet die einzelnen Verarbeitungsansatz Thread und nicht die ACK-Datei zurückschicken, bis der Thread die Verarbeitung abgeschlossen hat. Gibt es eine Möglichkeit, dies einen mutli Thread Prozess zu machen? Fädeln # 1 - nehmen die eingehenden SOAP-Anforderung und zurückschicken die ACK Fädeln # 2 - Verarbeiten Sie die SOAP-Anforderung

Ich weiß, dass ich es brechen könnte in wie eine DB-Tabelle oder Flat-File, aber gibt es eine Möglichkeit, dies zu erreichen, ohne das zu tun?

Ich werde versuchen, die Fassung nach der ACK-Vorlage zu schließen und die Verarbeitung fortsetzen, kreuze meine Finger, es wird funktionieren.

War es hilfreich?

Lösung 5

Also, was ich getan habe ist:

  1. Nehmen Sie alle eingehenden OBM ist, analysieren sie in einen DB
  2. Wenn dies geschehen ist geschossen von einem Prozess, der im Hintergrund läuft (tatsächlich den Hintergrund sende ich es so das Skript beenden kann)
  3. Senden ACK-Datei zurück

Mit dem nur die Rohdaten zu akzeptieren, Parsing in Felder und in ein DB Einfügen ist ziemlich schnell. Dann Ausgabe ich einen Befehl Linux Befehlszeile, die auch die Verarbeitung Skript senden im Hintergrund laufen zu lassen. Dann habe ich die ACK-Datei SF und das Skript Enden innerhalb der vorgegebenen Zeit senden. Es ist lästig, den Skript Prozess in zwei getrennte Phasen aufgeteilt, aber es funktioniert.

Andere Tipps

Sounds wie die ausgehende Nachricht trifft den Timeout. Andere Benutzer haben Timeouts so niedrig wie 10 Sekunden (siehe Forum Link unten) angegeben. Die Sandbox-Instanz, dass I (CS1) verwenden wird eine Zeitüberschreitung nach ca. 1 Minute, von meinen Tests. Es ist möglich, dass das Timeout ist eine Organisation oder Instanzebene Einstellung, dass Salesforce Kontrollen.

Zwei Dinge, die Sie könnten versuchen:

  1. Öffnen Sie ein Support-Ticket mit Salesforce, um zu sehen, wenn sie können erhöhen, um den Timeout-Wert für ausgehende Nachrichten. Von meinem Erfahrung gibt es viele Einstellungen, dass sie auf dem ändern Organisationsebene - dies könnte sein einer von ihnen.

  2. Offload Verarbeitung Ihrer Daten, so dass das ACK sofort gesendet zurück zu Salesforce. Danach wird die aktuelle Verarbeitung Ihrer Daten nehmen asynchron. dh. Botschaft Warteschlange, separater Thread, etc.

Einige andere Ressourcen, die nützlich sein könnten:

verwandte Salesforce Forum Diskussion

Outbound-Messaging-Dokumentation

Ich denke, sie Timeout die Sache für Ihr Skript zu Ende zu warten.

Es gibt einen Weg Sie könnten versuchen, dieses Problem zu beheben.

Ausgabe der Umschlag mit ack Nachricht am Anfang und dann das Ding spülen, so dass ihre Server werden es vor Ihnen Verarbeitung beenden. Kein Einfädeln, einfach nur Prioritäten zu überdenken:)

dies für die besten Infos lesen Inhalt Spülung

Sind Sie 100% sicher, dass Salesforce die Zeit, Ihre Skripte warten müssen zu laufen? 80 Sekunden wirken wie eine loong Zeit zu mir.

Wenn alle Anfragen fehlgeschlagen Ich würde vermuten, dass Salesforce Sie den Content-Type Header entsprechend eingestellt werden erwartet, aber das scheint nicht der Fall zu sein.

Ich weiß nicht, über Salesforce, aber wenn Sie etwas Multithreading mit PHP machen möchten, sollten Sie einen Blick auf In diesem Codebeispiel und genauer auf pcntl_fork () .

N. B: pcntl ist nicht standardmäßig aktiviert und wird nicht auf Windows-Plattformen

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top