Question

Salesforce peut envoyer jusqu'à 100 demandes à l'intérieur 1 message SOAP. Lors de l'envoi ce type de message en bloc Ooutbound demander mon script PHP fin de l'exécution, mais SF ne parvient pas à accepter l'ACK utilisé pour effacer la file d'attente des messages sur le côté Salesforce des choses. En regardant le journal des messages sortants (suivi) Je vois tous les messages dans un état d'attente avec l'échec de livraison Raison « java.net.SocketTimeoutException: Lire timed out ». Si mon script a terminé l'exécution, pourquoi dois-je obtenir cette erreur?

J'ai essayé ces méthodes pour augmenter le temps d'exécution sur mon serveur que je n'ai pas accès sur le côté Salesforce:

  • set_time_limit (0); // dans le script
  • max_execution_time = 360; temps d'exécution maximum de chaque script, en secondes
  • max_input_time = 360; Montant maximum de temps chaque script peut passer l'analyse des données de demande
  • memory_limit = 32M; quantité maximale de mémoire d'un script peut consommer

J'utilisé les réglages élevés que pour les tests.

Toute pensée pourquoi cela ne parvient pas à la livraison de ACK à Salesforce?

Voici une partie du code: Voilà comment je l'accepte et envoie le fichier ACK pour la requête SOAP imcoming

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

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

La fonction de répondre

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

Ce sont dans un script générique que j'inclure dans le script qui utilise les données pour un flux de travail spécifique. Je peux traiter environ 25 demandes (qui sont 1 réponse SOAP), mais une fois que je vais sur ce que je reçois l'erreur de délai d'attente dans la file d'attente Salesforce. pour 50 demandes est prend habituellement mon script PHP 86,77 secondes.

Apache pourrait-il? PHP?

Je l'ai aussi testé simplement accepter la réponse SOAP 100 et demande simplement accepter et l'envoi de l'accusé de réception de la file d'attente efface, donc je sais qu'il est de mon côté des choses.

Je montre aucune erreur dans le journal apache, le script fonctionne très bien.

J'ai trouvé quelques informations sur le site Salesforce, mais toujours pas de chance. Voici le lien .

Je suis aussi en utilisant la boîte à outils PHP 11 (Salesforce).

Autre Forum avec une bonne aide SF

Merci pour toute idée de cela, --Phill

Mise à jour:

Si je reçois le message entrant et imprimer la réponse, si cela devait arriver d'abord, peu importe si je fais quelque chose d'autre après? Ou faut-il attendre que mon processus pour terminer, puis imprimer la réponse?

Mise à jour # 2:

d'accord, je pense que j'ai le problème: PHP utilise l'approche de traitement de fil simple et ne renverra pas le fichier ACK jusqu'à ce que le fil est terminé, il est le traitement. Est-il un moyen de faire un processus de fil mutli? Discussion # 1 - accepter la requête SOAP entrante et renvoyer l'accusé de réception Discussion # 2 - Traiter la demande SOAP

Je sais que je pouvais diviser en comme une table de base de données ou d'un fichier plat, mais est-il un moyen d'y arriver sans le faire?

Je vais essayer de fermer la prise après la présentation ACK et continuer le traitement, croise les doigts pour qu'il fonctionne.

Était-ce utile?

La solution 5

Alors que je l'ai fait est:

  1. Accepter tous OBM entrant de, les analyser dans un DB
  2. Lorsque cela est fait coup d'un processus qui fonctionne en arrière-plan (En fait, je l'envoie à l'arrière-plan afin que le script peut se terminer)
  3. Envoyer fichier ACK

En acceptant juste les données brutes, l'analyse syntaxique dans les champs et l'insérer dans un DB est assez rapide. Ensuite, j'envoie une commande de ligne de commande Linux qui envoient également le script de traitement pour exécuter en arrière-plan. Puis-je envoyer le fichier ACK à SF et le script se termine dans le délai imparti. Il est lourd de diviser le processus de script en deux étapes distinctes, mais cela fonctionne.

Autres conseils

Sons comme le message sortant est de frapper le délai d'attente. D'autres utilisateurs ont signalé les délais d'attente aussi bas que 10 secondes (voir le lien forum ci-dessous). L'instance de bac à sable que j'utilise (cs1) est le timing après environ 1 minute, de mes tests. Il est possible que le délai d'attente est un paramètre de niveau de l'organisation ou de l'instance qui contrôle Salesforce.

Deux choses que vous pouvez essayer:

  1. Ouvrir un ticket de support avec Salesforce pour voir s'ils peuvent augmenter la valeur de délai d'attente pour les messages sortants. De mon expérience, il y a beaucoup de les paramètres qu'ils peuvent modifier le niveau de l'organisation - cela pourrait être l'un d'entre eux.

  2. Traitement de Offload de vos données, afin que l'accusé de réception est envoyé immédiatement revenir à Salesforce. Ensuite, la réelle le traitement de vos données prendra de manière asynchrone. c'est à dire. Message file d'attente, thread séparé, etc.

D'autres ressources qui pourraient être utiles:

discussion forum Salesforce connexes

documentation de messagerie sortante

Je pense qu'ils Timeout chose d'attente pour votre script à la fin.

Il y a une façon que vous pouvez essayer de résoudre ce problème.

Sortie l'enveloppe avec le message ack au début, puis rincer la chose afin que leur serveur, il obtient avant de terminer le traitement. Pas de filetage, juste priorités plaine Rethinking:)

lire ceci pour meilleures infos sur le contenu de chasse

Êtes-vous sûr à 100% que Salesforce attendra la quantité de temps vos scripts doivent aussi exécuter? 80 secondes semblent comme un temps de Loong trop me.

Si toutes les demandes ont échoué, je suppose que Salesforce vous attend de définir l'en-tête de Content-Type appropriée, mais cela ne semble pas être le cas.

Je ne sais pas Salesforce, mais si vous voulez faire un peu multithreading avec PHP, vous devriez jeter un oeil à cet exemple de code et plus précisément à pcntl_fork () .

N.B.:. Pcntl est pas activé par défaut et ne fonctionnera pas sur les plates-formes Windows

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top