Доброго дня времени. По задаче нужно делать очень много гет http запросов и на основе ответных данных создавать записи в SF. Меня интересует если какое грамотное решение для организации кода с этими запросами? Обработка исключений и т.д. Может есть какой паттерн для SF для этого? И как вы это делаете?
Доброго дня времени.
По задаче нужно делать очень много гет http запросов и на основе ответных данных создавать записи в SF.
Меня интересует если какое грамотное решение для организации кода с этими запросами? Обработка исключений и т.д. Может есть какой паттерн для SF для этого? И как вы это делаете?
Нужно больше подробностей. Могут ли запросы выполняться параллельно? Зависит ли следующий запрос от предыдущего? Как должен происходить процесс? Real-time, background?
[quote="DevNull"]
Доброго дня времени.
По задаче нужно делать очень много гет http запросов и на основе ответных данных создавать записи в SF.
Меня интересует если какое грамотное решение для организации кода с этими запросами? Обработка исключений и т.д. Может есть какой паттерн для SF для этого? И как вы это делаете?
[/quote]
Нужно больше подробностей.
Могут ли запросы выполняться параллельно?
Зависит ли следующий запрос от предыдущего?
Как должен происходить процесс? Real-time, background?
К сожалению да( И дело в том что по результату одного запроса могут идти несколько запросов дальше, и опять. Примерная схема: http://cs622025.vk.me/v622025418/2152d/NuacgrXgZ8g.jpg Запись в объекте формирует на основе всех уровней, то есть если смотреть по схеме то будет 6 записей где собраны данные из 3 уровней запросов. Причем если ответы на запросы третьего слоя будут пустыми все равно создать записи, но с пустыми полями где должны быть данные из тертьего слоя.
Каждую ночь по таймеру
Я думаю надо сделать как-то послойно, и создавать каждый слой данных батчем по предыдущему слою.
[quote="Gres"]Зависит ли следующий запрос от предыдущего? [/quote]
К сожалению да( И дело в том что по результату одного запроса могут идти несколько запросов дальше, и опять.
Примерная схема:
http://cs622025.vk.me/v622025418/2152d/NuacgrXgZ8g.jpg
Запись в объекте формирует на основе всех уровней, то есть если смотреть по схеме то будет 6 записей где собраны данные из 3 уровней запросов. Причем если ответы на запросы третьего слоя будут пустыми все равно создать записи, но с пустыми полями где должны быть данные из тертьего слоя.
[quote="Gres"]Как должен происходить процесс? Real-time, background?[/quote]
Каждую ночь по таймеру
Я думаю надо сделать как-то послойно, и создавать каждый слой данных батчем по предыдущему слою.
[quote="DevNull"][quote="Gres"]Зависит ли следующий запрос от предыдущего? [/quote]
К сожалению да( И дело в том что по результату одного запроса могут идти несколько запросов дальше, и опять.
Примерная схема:
http://cs622025.vk.me/v622025418/2152d/NuacgrXgZ8g.jpg
Запись в объекте формирует на основе всех уровней, то есть если смотреть по схеме то будет 6 записей где собраны данные из 3 уровней запросов. Причем если ответы на запросы третьего слоя будут пустыми все равно создать записи, но с пустыми полями где должны быть данные из тертьего слоя.
[quote="Gres"]Как должен происходить процесс? Real-time, background?[/quote]
Каждую ночь по таймеру
Я думаю надо сделать как-то послойно, и создавать каждый слой данных батчем по предыдущему слою.[/quote]
Сделай цеплочку батчев тогда.
Кст. с новыми лимитами на callouts это будет даже относительно быстро работать.
Кст. с новыми лимитами на callouts это будет даже относительно быстро работать.
По обработке ошибок и архитектуре - раздели все слои на сервисы, выдели DAO, реализуй кастомные ошибки, можешь сделать небольшую обертку над батчами, так как логика бедт одинаковая, можешь использовать очередь из батчей.
По обработке ошибок и архитектуре - раздели все слои на сервисы, выдели DAO, реализуй кастомные ошибки, можешь сделать небольшую обертку над батчами, так как логика бедт одинаковая, можешь использовать очередь из батчей.
хм, я так понял с батча нельзя делать callouts( Также как и запускать future методы... Что же мне делать то...
[quote="DevNull"]хм, я так понял с батча нельзя делать callouts( Также как и запускать future методы... Что же мне делать то...[/quote]
Используй Database.AllowsCallouts
[quote="DevNull"][quote="Gres"]Используй Database.AllowsCallouts[/quote]
Огромное спасибо! Работает![/quote]
@future(AllowsCallouts = true)
Вот еще
Хочу из future запустить Батч выдает ошибку - First error: Database.executeBatch cannot be called from a batch start, batch execute, or future method. future запускается из Scheduled класса. Почему я использую future из Scheduled? Потому что если используются http запросы в Scheduled то будет ошибка. Как мне выйти из положения? Общая схема работы Scheduled --> future --> Batch
Хочу из future запустить Батч выдает ошибку - First error: Database.executeBatch cannot be called from a batch start, batch execute, or future method.
future запускается из Scheduled класса.
Почему я использую future из Scheduled? Потому что если используются http запросы в Scheduled то будет ошибка.
Как мне выйти из положения?
Общая схема работы Scheduled --> future --> Batch
Хочу из future запустить Батч выдает ошибку - First error: Database.executeBatch cannot be called from a batch start, batch execute, or future method. future запускается из Scheduled класса. Почему я использую future из Scheduled? Потому что если используются http запросы в Scheduled то будет ошибка. Как мне выйти из положения? Общая схема работы Scheduled --> future --> Batch
[quote="DevNull"]Хочу из future запустить Батч выдает ошибку - First error: Database.executeBatch cannot be called from a batch start, batch execute, or future method.
future запускается из Scheduled класса.
Почему я использую future из Scheduled? Потому что если используются http запросы в Scheduled то будет ошибка.
Как мне выйти из положения?
Общая схема работы Scheduled --> future --> Batch[/quote]
Почему бы не использовать сразу Scheduled Batch?
[quote="DevNull"][quote="Gres"]Scheduled Batch[/quote]
Эмм, тоесть?[/quote]
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_batch_interface.htm#apex_batch_scheduleBatch_section
Just Google It
Вопрос такой, дабы не плодить темы. Я запускаю future, можно ли как то отследить окончание его выполнения в apex коде?
Вопрос такой, дабы не плодить темы.
Я запускаю future, можно ли как то отследить окончание его выполнения в apex коде?
Вопрос такой, дабы не плодить темы.
1. Я запускаю future, можно ли как то отследить окончание его выполнения в apex коде? 2. Можно ли вообще из Scheduled делать HTTP запросы? Просто так не пускает. Может есть что то типа Database.AllowsCallouts для батча?
Вопрос такой, дабы не плодить темы.
1. Я запускаю future, можно ли как то отследить окончание его выполнения в apex коде?
2. Можно ли вообще из Scheduled делать HTTP запросы? Просто так не пускает. Может есть что то типа Database.AllowsCallouts для батча?
1. Нет, это асинхронный вызов 2. А что мешает в скедулере запускать батч из которого можно в каждом execute до 100 callouts делать
зачем future собственно?
Может опиши юзкейс, быть может есть другое решение?
1. Нет, это асинхронный вызов
2. А что мешает в скедулере запускать батч из которого можно в каждом execute до 100 callouts делать
зачем future собственно?
Может опиши юзкейс, быть может есть другое решение?
. А что мешает в скедулере запускать батч из которого можно в каждом execute до 100 callouts делать
зачем future собственно?
Может опиши юзкейс, быть может есть другое решение?
Да уже нашел решение. Раньше сначала запускался класс который делал запрос на внешний сервер и получал парсил вставлял в базу данные. По том по этим данным шел батч которое тоже делал запросы и т.д. Выход нашел так: Просто поместил весь код начального класса в start метод батча. Тоесть батч теперь сначал вставляет данные, потом уже по ним идет.
[quote="Дима Лисовский"]. А что мешает в скедулере запускать батч из которого можно в каждом execute до 100 callouts делать
зачем future собственно?
Может опиши юзкейс, быть может есть другое решение?[/quote]
Да уже нашел решение.
Раньше сначала запускался класс который делал запрос на внешний сервер и получал парсил вставлял в базу данные. По том по этим данным шел батч которое тоже делал запросы и т.д.
Выход нашел так: Просто поместил весь код начального класса в start метод батча. Тоесть батч теперь сначал вставляет данные, потом уже по ним идет.