Salesforce / PHP - Массовое исходящее сообщение (SOAP), проблема истечения времени ожидания - см. Обновление № 2 - PullRequest
2 голосов
/ 18 марта 2010

Salesforce может отправить до 100 запросов в одном сообщении SOAP.При отправке этого типа запроса на сообщение Bulk Ooutbound мой PHP-скрипт завершает свою работу, но SF не может принять ACK, использованный для очистки очереди сообщений на стороне Salesforce.Просматривая журнал исходящих сообщений (мониторинг), я вижу все сообщения в состоянии ожидания с Причиной сбоя доставки "java.net.SocketTimeoutException: Тайм-аут чтения".Если мой скрипт завершил выполнение, почему я получаю эту ошибку?

Я попробовал эти методы, чтобы увеличить время выполнения на моем сервере, поскольку у меня нет доступа со стороны Salesforce:

  • set_time_limit (0);// в скрипте
  • max_execution_time = 360;Максимальное время выполнения каждого скрипта в секундах
  • max_input_time = 360;Максимальное количество времени, которое каждый скрипт может потратить на анализ данных запроса
  • memory_limit = 32M;Максимальный объем памяти, который может потребоваться сценарию

Я использовал высокие настройки только для тестирования.

Есть мысли о том, почему не удается доставить ACK обратно в Salesforce?

Вот часть кода: Вот как я принимаю и отправляю ACK-файл для предстоящего SOAP-запроса

$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?

Я также проверил, просто принимая SOAP-ответ на 100 запросов и просто принимая и отправляя ACK, очередь очищается, поэтому я знаю, что это на моей стороне.

Я не вижу ошибок вВ журнале apache скрипт работает нормально.

Я нашел некоторую информацию на сайте Salesforce, но все равно не повезло.Вот ссылка .

Также я использую PHP Toolkit 11 (From Salesforce).

Другой форум с хорошей помощью SF

Спасибо за понимание, --Phill

ОБНОВЛЕНИЕ:

Если я получаю входящее сообщение и распечатываю ответ, должно ли это произойти первым, независимо от того, буду ли я делать что-то ещепосле?Или он ждет завершения моего процесса, а затем распечатывает ответ?

ОБНОВЛЕНИЕ № 2:

хорошо, я думаю, у меня проблема: PHP использует однопотоковый подход и не будет отправлять обратно файл ACK, пока поток не завершит свою обработку.Есть ли способ сделать это многопоточным процессом?Поток # 1 - принять входящий запрос SOAP и отправить обратно ACK Поток # 2 - обработать запрос SOAP

Я знаю, что могу разбить его на таблицу БД или простой файл, но есть ли способсделать это без этого?

Я попытаюсь закрыть сокет после отправки ACK и продолжить обработку, скрестив пальцы, это сработает.

Ответы [ 5 ]

1 голос
/ 23 марта 2010

Похоже, что исходящее сообщение превысило время ожидания. Другие пользователи сообщили, что время ожидания составляет всего 10 секунд (см. Ссылку на форум ниже). Экземпляр песочницы, который я использую (cs1), истекает примерно через 1 минуту после моего тестирования. Возможно, что тайм-аут является настройкой уровня организации или экземпляра, которой управляет Salesforce.

Две вещи, которые вы можете попробовать:

  1. Открыть заявку в службу поддержки с Salesforce, чтобы увидеть, если они могут увеличить значение тайм-аута для исходящие сообщения. От моего опыт, есть много настройки, которые они могут изменить на уровень организации - это может быть один из них.

  2. Разгрузка обработки ваших данных, поэтому что ACK отправлено немедленно вернуться к Salesforce. Тогда фактический обработка ваших данных займет разместить асинхронно. то есть. Сообщение очередь, отдельный поток и т. д.

Некоторые другие ресурсы, которые могут быть полезны:

соответствующее обсуждение на форуме Salesforce

Документация по исходящим сообщениям

1 голос
/ 26 марта 2010

Я думаю, что они ожидают, пока Твой сценарий закончится.

Есть способ, которым вы можете попытаться это исправить.

Вывести конверт с подтверждением сообщения в начале, а затем очистить его, чтобы его сервер получил его до того, как вы закончите обработку. Нет потоков, просто переосмысление приоритетов:)

прочитайте это для лучшей информации о содержимом очистки

0 голосов
/ 10 сентября 2010

Итак, что я сделал, это:

  1. Принимать все входящие OBM, анализировать их в БД
  2. Когда это делается, запускается процесс, который выполняется в фоновом режиме (на самом деле я отправляю его в фоновый режим, чтобы скрипт мог завершиться)
  3. Отправить файл ACK обратно

Достаточно быстро принять необработанные данные, выполнить синтаксический анализ полей и вставить их в БД. Затем я запускаю команду командной строки Linux, которая также отправляет сценарий обработки для запуска в фоновом режиме. Затем я отправляю файл ACK в SF, и сценарий заканчивается в отведенное время. Делать процесс сценария на два отдельных этапа неудобно, но это работает.

0 голосов
/ 29 марта 2010

Я не знаю о Salesforce, но если вы хотите создать многопоточность с помощью PHP, вам нужно взглянуть на этот пример кода , а точнее на pcntl_fork () .

N.B: pcntl не включен по умолчанию и не будет работать на платформах Windows.

0 голосов
/ 18 марта 2010

Вы на 100% уверены, что Salesforce будет ожидать, сколько времени ваши скрипты должны запустить? 80 секунд кажутся мне слишком долгим.

Если бы все запросы не были выполнены, я бы предположил, что Salesforce ожидает, что вы настроите заголовок Content-Type соответствующим образом, но это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...