Регистрация  |  Вход

Что делать с фронтом во время долгой операции на бек-энде?

Всем привет!

Сейчас я налаживаю взаимодействие со сторонним SOAP сервисом, цель проста - просто отсылать какую то инфу.

Из WSDL файла SF создал для меня класс, в котором есть метод который собственно и делает аут-кол, и множество вспомогательные классов, в основном контейнеров для данных.

Ну и вот я задумался, как теперь это практически реализовать.

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

Но это все как то слишком просто:

(1) во первых если транзакция прошла успешно та ВФ страница должна выкинуть на пару сек сообщение что все ОК, так как на исходной стандартной странице такое уведомление уже так просто не организуешь.

(2) Но самое главное - что если ответ от стороннего серевера нужно ждать несколько сек??? что происходит с фронтом? что видит пользователем?

(3) а что если ответ вовсе не пришел? снова пробовать? програмно или уведомлять пользователя?

(4) а что если ответ пришел - но указывает на ошибку в передаче данных.

В общем, действительно есть над чем подумать и жду вашего мнения по этому вопросу.

Спасибо

Всем привет!

Сейчас я налаживаю взаимодействие со сторонним SOAP сервисом, цель проста - просто отсылать какую то инфу.
Из WSDL файла SF создал для меня класс, в котором есть метод который собственно и делает аут-кол, и множество вспомогательные классов, в основном контейнеров для данных.

Ну и вот я задумался, как теперь это практически реализовать.

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

Но это все как то слишком просто:
(1) во первых если транзакция прошла успешно та ВФ страница должна выкинуть на пару сек сообщение что все ОК, так как на исходной стандартной странице такое уведомление уже так просто не организуешь.

(2) Но самое главное - что если ответ от стороннего серевера нужно ждать несколько сек??? что происходит с фронтом? что видит пользователем?

(3) а что если ответ вовсе не пришел? снова пробовать? програмно или уведомлять пользователя?

(4) а что если ответ пришел - но указывает на ошибку в передаче данных.

В общем, действительно есть над чем подумать и жду вашего мнения по этому вопросу.

Спасибо

Всем очень просто особенно если делал это раньше. Тебе просто надо несколько вещей @Remote Action для метода . JavaScript и setTimeOut и какая нибудь картинка которая будет плавать пока твой запрос парсится.

Всем очень просто особенно если делал это раньше. Тебе просто надо несколько вещей @Remote Action для метода . JavaScript и setTimeOut и какая нибудь картинка которая будет плавать пока твой запрос парсится.

Можно еще проще.

apex:actionPoller

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.

Можно еще проще.

[url=https://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_actionPoller.htm]apex:actionPoller[/url]

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.

Dmitry Shnyrev
Можно еще проще.

apex:actionPoller

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.

Отлично. Вот из описания этого элемента.

It's a best practice to avoid performing DML, external service calls, and other resource-intensive operations in action methods called by an <apex:actionPoller>.

Но, возможно, это предупреждение нас и не касается, так как мы не делаем вызов удаленого сервиса через акшен метод... или делаем?

у меня в голове еще полностью не уложилось все. Ладно давай по шагам:
(1) есть ВФ кнопка на станд дитейл лайаут.
(2) нажатие приводит к новой странице, контроллер которой выполняет СОАП вызов и ждет результат. На странице ничего и нет кроме крутящихся часов и надписи "подождете плиз".
(3) но как пользователь увидит фронт, если контроллер висит на сервисе, и ничего не высылает в это время на браузер? получается что надо как-то сделать чтобы пользователь что-то видел, пока контроллер что-то делает. Как?
(4) И вот через одну сотую секунды или через 5 сек приходит ответ, и как перегрузить фронт (будет надпись "все хорошо" и кнопка вернутся на прежную страницу?)?
(5) а если транзакция осталась без ответа, то как словить эту ситуацию (то, что дольше уже не ждем)?

Пока еще этот пазл не складывается у меня в голове в единую картинку. Понедельники - они такие...

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

[quote="Dmitry Shnyrev"]Можно еще проще.

[url=https://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_actionPoller.htm]apex:actionPoller[/url]

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.[/quote]

Отлично. Вот из описания этого элемента.

[i] It's a best practice to avoid performing DML, [b]external service calls, [/b]and other resource-intensive operations [b]in action methods [/b]called by an <apex:actionPoller>. [/i]

Но, возможно, это предупреждение нас и не касается, так как мы не делаем вызов удаленого сервиса через акшен метод... или делаем?

у меня в голове еще полностью не уложилось все. Ладно давай по шагам:
(1) есть ВФ кнопка на станд дитейл лайаут.
(2) нажатие приводит к новой странице, контроллер которой выполняет СОАП вызов и ждет результат. На странице ничего и нет кроме крутящихся часов и надписи "подождете плиз".
(3) но как пользователь увидит фронт, если контроллер висит на сервисе, и ничего не высылает в это время на браузер? получается что надо как-то сделать чтобы пользователь что-то видел, пока контроллер что-то делает. Как?
(4) И вот через одну сотую секунды или через 5 сек приходит ответ, и [b]как перегрузить фронт [/b](будет надпись "все хорошо" и кнопка вернутся на прежную страницу?)?
(5) а если транзакция осталась без ответа, то как словить эту ситуацию (то, что дольше уже не ждем)?

Пока еще этот пазл не складывается у меня в голове в единую картинку. Понедельники - они такие...  :) 

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

It's a best practice to avoid performing DML, external service calls, and other resource-intensive operations in action methods called by an <apex:actionPoller>.

Тут ты неправильно понял. apex:actionPoller нужен только для того чтобы проверить что какая-то процедура длительная по времени закончилась, чтобы оповестить пользователя.

В твоем случае например - чела редиректит на твою специальную страницу, которая при инициализации запускает супер долгий процесс. Пользователю показывается страница со крутилкой или танцующим котиком, а в это время apex:actionPoller опрашивает состояние процесс (например из результатов в базе данных) и как только данные изменились радостно оповещает об это пользовтателя (закрывает страницу напримем).

но как пользователь увидит фронт, если контроллер висит на сервисе, и ничего не высылает в это время на браузер? получается что надо как-то сделать чтобы пользователь что-то видел, пока контроллер что-то делает. Как?

Запустить процесс через future метод (асинхронно) - тогда страница тут же вернется пользователю, а процесс пойдет дальше работать

[quote]It's a best practice to avoid performing DML, external service calls, and other resource-intensive operations in action methods called by an <apex:actionPoller>. [/quote]

Тут ты неправильно понял. apex:actionPoller нужен только для того чтобы проверить что какая-то процедура длительная по времени закончилась, чтобы оповестить пользователя.

В твоем случае например - чела редиректит на твою специальную страницу, которая при инициализации запускает супер долгий процесс. Пользователю показывается страница со крутилкой или танцующим котиком, а в это время apex:actionPoller опрашивает состояние процесс (например из результатов в базе данных) и как только данные изменились радостно оповещает об это пользовтателя (закрывает страницу напримем).

[quote]но как пользователь увидит фронт, если контроллер висит на сервисе, и ничего не высылает в это время на браузер? получается что надо как-то сделать чтобы пользователь что-то видел, пока контроллер что-то делает. Как?[/quote]
Запустить процесс через future метод (асинхронно) - тогда страница тут же вернется пользователю, а процесс пойдет дальше работать

Вот теперь я кажется понял самое главное - с фронта мы не обращается напрямую к процессу (потоку) отправки-получения сообщений ВЕБ-сервиса с вопросом "ну как там дела?" (это наверное технически невозможно).

Мы "караулим" результат - который должен проявится каким то изменением в БД (а как еще).

Вот теперь становится понятно.

Вот теперь я кажется понял самое главное - с фронта мы не обращается напрямую к процессу (потоку) отправки-получения сообщений ВЕБ-сервиса с вопросом  "ну как там дела?" (это наверное технически невозможно).

Мы "караулим" [b]результат[/b] - который должен проявится каким то изменением в БД (а как еще).

Вот теперь становится  понятно.

Dmitry Shnyrev
Можно еще проще.

apex:actionPoller

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.


Прикольно я думал что изобрел фичу а оказывается придумал велосипед.Надо будет по юзать это.

[quote="Dmitry Shnyrev"]Можно еще проще.

[url=https://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_actionPoller.htm]apex:actionPoller[/url]

использовал во многих проектах. Тоже самое описал Sergey Prichepo, только без javascript, так сказать, по Salesforce style.[/quote]
Прикольно я думал что изобрел фичу а оказывается придумал велосипед.Надо будет по юзать это.

Попробовал apex:actionPoller и apex:actionStatus - понравилось... <!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Дразнится" /><!-- s:P -->

сам apex:actionPoller нужно ставить внутри передергиваемой панели, чтобы в какой-то момент вырубить его через аттрибут enabled

Попробовал  [b] apex:actionPoller  и apex:actionStatus [/b]- понравилось...   <!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Дразнится" /><!-- s:P --> 

сам [b]apex:actionPoller [/b] нужно ставить внутри передергиваемой панели, чтобы в какой-то момент вырубить его через аттрибут enabled