Domanda

Salesforce può inviare fino a 100 richieste all'interno di un messaggio SOAP 1. Durante l'invio di questo tipo di messaggio Ooutbound Bulk richiedere il mio script PHP termina l'esecuzione, ma SF non riesce ad accettare l'ACK usato per cancellare la coda di messaggi sul lato Salesforce delle cose. Guardando il log dei messaggi in uscita (monitoraggio) vedo tutti i messaggi in uno stato in sospeso con la consegna Failure Reason "java.net.SocketTimeoutException: Leggi scaduta". Se il mio script ha terminato l'esecuzione, perché ottengo questo errore?

Ho cercato questi metodi per aumentare il tempo di esecuzione sul mio server come non ho accesso sul lato Salesforce:

  • set_time_limit (0); // nello script
  • max_execution_time = 360; tempo massimo di esecuzione di ogni script, in secondi
  • max_input_time = 360; tempo massimo ogni script può spendere l'analisi richiesta di dati
  • memory_limit = 32M; Massima quantità di memoria di uno script può consumare

Ho usato le impostazioni alte solo per i test.

Qualche idea per spiegare perché questo sta venendo a mancare la consegna ACK al Salesforce?

Un po 'di codice: Questo è il modo accetto e inviare il file ACK per la richiesta SOAP imcoming

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

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

La funzione di rispondere

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

Queste sono in uno script generico che includo nello script che utilizza i dati per un flusso di lavoro specifico. Sono in grado di elaborare circa 25 richieste (che sono 1 risposta SOAP), ma una volta che vado oltre che ottengo l'errore di timeout in coda Salesforce. per 50 richieste è di solito prende il mio script PHP 86.77 secondi.

Potrebbe essere Apache? PHP?

Ho anche testato solo accettando la risposta SOAP 100 richiesta e solo accettare e inviare l'ACK coda cancella, quindi so che è sul mio lato delle cose.

mi mostra nessun errore nel log di Apache, lo script funziona bene.

Ho trovato alcune informazioni sul sito di Salesforce, ma ancora senza fortuna. Ecco il link .

Anche io sto usando il PHP Toolkit 11 (da Salesforce).

Altro forum con buona SF aiuto

Grazie per qualsiasi comprensione di questo, --Phill

UPDATE:

Se ricevo il messaggio in arrivo e stampare la risposta, dovrebbe accadere prima, indipendentemente se faccio qualcos'altro dopo? Oppure è aspettare che il mio processo per terminare e quindi stampare la risposta?

UPDATE # 2:

va bene penso di avere il problema: PHP utilizza l'approccio singolo thread trattamento e non invierà il file ACK fino a quando il thread è completata è la lavorazione. C'è un modo per rendere questo un processo di discussione mutli? Discussione # 1 - accettare la richiesta SOAP in entrata e rispedire l'ACK Discussione # 2 - elaborare la richiesta SOAP

So che potrei suddividerlo in come una tabella DB o file flat, ma c'è un modo per ottenere questo risultato senza fare che?

ho intenzione di provare a chiudere la presa dopo la presentazione ACK e continuare il trattamento, incrocio le dita che funzionerà.

È stato utile?

Soluzione 5

Quindi quello che ho fatto è:

  1. accettare tutti in entrata OBM di, li analizzare in un DB
  2. Quando questo è fatto il tiro di un processo che viene eseguito in background (in realtà mando allo sfondo in modo lo script può finire)
  3. Invia file di ACK

Con solo accettando i dati grezzi, l'analisi nei campi e l'inserimento in un DB è abbastanza veloce. Poi ho eseguire un comando della riga di comando di Linux che inviare anche lo script di elaborazione per l'esecuzione in background. Poi mando il file ACK a SF e lo script finisce entro il tempo assegnato. E 'ingombrante per dividere il processo di script in due fasi distinte, ma funziona.

Altri suggerimenti

Sembra che il messaggio in uscita sta colpendo il timeout. Altri utenti hanno segnalato i timeout a partire da 10 secondi (vedi link forum qui sotto). L'istanza sandbox che uso (CS1) è timeout dopo circa 1 minuto, dal mio test. E 'possibile che il timeout è un ambiente livello di organizzazione o istanza che i controlli di Salesforce.

Due cose che si potrebbe provare:

  1. Aprire un ticket di supporto con Salesforce per vedere se possono aumentare il valore di timeout per i messaggi in uscita. Dal mio esperienza, ci sono molte impostazioni che si possono modificare sul livello di organizzazione - questo potrebbe essere uno di loro.

  2. elaborazione offload dei dati, in modo da che l'ACK viene inviato immediatamente tornare a Salesforce. Quindi l'attuale trattamento dei Suoi dati avrà posizionare in modo asincrono. vale a dire. Messaggio coda, thread separato, ecc.

Alcune altre risorse che potrebbero essere utili:

relativa discussione Salesforce forum

uscita documentazione di messaggistica

Credo che la cosa timeout in attesa per lo script alla fine.

C'è un modo Si potrebbe provare a risolvere il problema.

Uscita la busta con il messaggio ack all'inizio e poi svuotare la cosa in modo che il loro server riceve prima di terminare l'elaborazione. No threading, semplicemente priorità ripensamento:)

leggere questo per migliori informazioni sulle vampate di calore contenuti

Sei sicuro al 100% che Salesforce attenderà la quantità di tempo i vostri script hanno bisogno di troppo correre? 80 secondi sembrano un tempo Loong anche me.

Se tutte le richieste non sono riusciti Direi che Salesforce si aspetta di impostare l'intestazione Content-Type in modo appropriato, ma questo non sembra essere il caso.

Non so su Salesforce, ma se si vuole fare un po 'di multithreading con PHP si dovrebbe dare un'occhiata a questo codice di esempio e più precisamente a pcntl_fork () .

NB:. PCNTL è non abilitato per default e non funziona su piattaforme Windows

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top