Salesforce / PHP - mensaje de salida a granel (SOAP), Tiempo hacia fuera la edición - ver Boletín # 2

StackOverflow https://stackoverflow.com/questions/2472746

Pregunta

Salesforce puede enviar hasta 100 solicitudes dentro mensaje 1 SOAP. Al enviar este tipo de mensajes a granel Ooutbound solicitar mi script PHP termine de ejecutarse, pero SF no acepta el ACK utiliza para borrar la cola de mensajes en el lado de las cosas Salesforce. Mirando el registro de mensajes de salida (control) que ver todos los mensajes en un estado pendiente con la entrega Falla Razón "java.net.SocketTimeoutException: Leer tiempo de espera". Si mi escritura ha terminado la ejecución, ¿por qué recibo este error?

He intentado estos métodos para aumentar el tiempo de ejecución en mi servidor ya que no tengo acceso en el lado de Salesforce:

  • set_time_limit (0); // en el guión
  • max_execution_time = 360; El tiempo máximo de ejecución de cada script, en segundos
  • max_input_time = 360; cantidad máxima de tiempo que cada secuencia de comandos puede emplear para analizar los datos de la solicitud
  • memory_limit = 32M; cantidad máxima de memoria que un script puede consumir

He utilizado los ajustes de alta sólo para las pruebas.

¿Alguna idea de por qué esto está fallando la entrega ACK al Salesforce?

Aquí es una parte del código: Así es como yo aceptar y enviar el archivo de ACK para la solicitud SOAP imcoming

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

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

La función responden

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

Estos son en un script genérico que incluyo en la secuencia de comandos que utiliza los datos para un flujo de trabajo específico. Puedo procesar cerca de 25 solicitudes (que se encuentran en 1 respuesta SOAP) pero una vez voy más que consigo el error de tiempo de espera en la cola de Salesforce. de 50 solicitudes es por lo general toma mi script PHP 86.77 segundos.

Podría ser Apache? PHP?

He probado también limitarse a aceptar la respuesta SOAP 100 pedido y simplemente aceptar y enviar el ACK la cola borra, así que sé que está de mi lado de las cosas.

muestro no hay errores en el registro de Apache, la secuencia de comandos se ejecuta correctamente.

Lo que encontrar algo de información sobre el sitio de Salesforce, pero aún ninguna suerte. Aquí es el enlace .

También estoy usando el kit de herramientas de PHP 11 (De Salesforce).

Otros foro con buena SF ayuda

Gracias por cualquier idea de esto, --Phill

ACTUALIZACIÓN:

Si recibo el mensaje entrante e imprimir la respuesta, si esto llegara a suceder primero sin importar si hago otra cosa después? ¿O esperar a que mi proceso hasta el final y luego imprima la respuesta?

ACTUALIZACIÓN # 2:

bien creo que tengo el problema: PHP utiliza el enfoque de procesamiento de un solo hilo y no enviar el archivo de ACK hasta que el mensaje ha completado está procesando. ¿Hay una manera de hacer esto un proceso hilo mutli? Hilo # 1 - acepta la solicitud SOAP entrante y enviar de vuelta el ACK Hilo # 2 - Procesar la solicitud SOAP

Sé que podría dividirla en como una tabla o base de datos de archivos planos, pero hay una manera de lograr esto sin hacer eso?

Voy a tratar de cerrar la toma después de la presentación de ACK y continuar con el procesamiento, cruzar los dedos para que funcione.

¿Fue útil?

Solución 5

Así que lo que he hecho es:

  1. Aceptar todas las llamadas entrantes de OBM, analizarlos en una base de datos
  2. Cuando se hace esto patada de un proceso que se ejecuta en segundo plano (En realidad lo envío a un segundo plano por lo que el script puede terminar)
  3. Enviar archivo ACK

Por limitarse a aceptar los datos sin procesar, analizar en los campos e insertándolo en una base de datos es bastante rápido. Entonces emite un comando de línea de comandos de Linux que también envía la secuencia de comandos de procesamiento para ejecutar en segundo plano. A continuación, le envío el archivo ACK a SF y el guión termina dentro del tiempo asignado. Es engorroso para dividir el proceso de escritura en dos etapas separadas pero funciona.

Otros consejos

Suena como el mensaje de salida está golpeando el tiempo de espera. Otros usuarios han informado de los tiempos de espera de tan solo 10 segundos (véase el enlace del foro más adelante). La instancia de caja de arena que utilizo (CS1) es el tiempo de espera después de aproximadamente 1 minuto, a partir de mis pruebas. Es posible que el tiempo de espera es una organización o instancia ajuste de nivel que los controles de Salesforce.

Hay dos cosas que usted podría intentar:

  1. Abrir un ticket de soporte con Salesforce para ver si pueden aumentar el valor de tiempo de espera para los mensajes salientes. De mi experiencia, hay muchas ajustes que puede modificar en el nivel de organización - esto podría ser uno de ellos.

  2. procesamiento de descarga de datos, por lo que el ACK se envía inmediatamente respaldar a Salesforce. A continuación, el real tratamiento de los datos se llevará a colocar de forma asíncrona. es decir. Mensaje cola, hilo separado, etc.

Algunos otros recursos que pueden ser útiles:

relacionada foro de discusión Salesforce

documentación mensajes salientes

Creo que la cosa de tiempo de espera a la espera de su guión hasta el final.

Hay una manera que usted podría tratar de solucionar este problema.

Salida del sobre con el mensaje ACK al principio y luego enjuagar la cosa para que su servidor lo consigue antes de terminar el procesamiento. No roscado, simplemente prioridades replanteamiento:)

leer esto para mejor información sobre vaciar contenido de

¿Estás 100% seguro de que Salesforce esperará la cantidad de tiempo que sus guiones necesitan demasiado correr? 80 segundos parecen como un tiempo demasiado Loong mí.

Si todas las solicitudes con error yo supongo que Salesforce espera establecer la cabecera Content-Type apropiadamente, pero esto no parece ser el caso.

No sé acerca de Salesforce, pero si usted quiere hacer algo de multihilo con PHP que debería echar un vistazo a este ejemplo de código y más precisamente a pcntl_fork () .

N.B:. PCNTL es no activado por defecto y no funcionará en plataformas de Windows

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top