AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2015, 10:42   #1  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
Спасибо за совет, идею понял. Если сформулировать точнее, то проблема заключается в следующем:
на вход импорт-класса я последовательно скармливаю XML-и, которые должны в определенной последовательности обрабатываться.

Скажем, у меня есть 5 XML-ей:
подал первую - скушал,
подал вторую - скушал,
на третьей подавился, выбросил ошибку, оборвал транзакцию, в итоге вся информация про 1-ю и 2-ю вместе с логами пропали, поскольку вызов сервиса происходит в контексте одной транзакции.

Значит теоретически я могу, используя метод #2, для каждого прохода открыть новый поток и в нем новое соединение? Или все открываемые потоки будут обрабатываться как одна транзакция?
Старый 16.11.2015, 17:26   #2  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Если я правильно понял проблему, то я бы смотрел в сторону модификации AIF - так что бы каждый вызов внешнего класса выполнялся отдельной транзакцией, но это мне видится далеко не тривиальной задачей. К тому же, лог в этом случае, вероятно будет потерян. Другой вариант - изменить принцип логирования\обработки исключений во внешнем классе. Можно, например в случае исключения отсылать лог Аксапте через другой простенький AIF сервис.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.

Последний раз редактировалось Link; 16.11.2015 в 18:41.
Старый 16.11.2015, 23:50   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1853 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Нельзя несколько вызовов AIF завернуть в некую внешнюю транзакцию. Но, как вариант, можно упаковать несколько документов в одно сообщение - смотрите в сторону Processing batched messages in AIF [AX 2012]
__________________
-ТСЯ или -ТЬСЯ ?
Старый 17.11.2015, 05:26   #4  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
можно упаковать несколько документов в одно сообщение
Насколько я понял речь идет про custom сервис, а не стандартные AIF документы.

Цитата:
НО: если хоть где-то в коде выбросится ошибка или вызов ttsabort, то соответственно ни лога, ни данных...
Можно выйти из транзакции которую AIF создает (ttscommit), try/catch вокруг вызова вашего класс и зайти обратно (ttsbegin). Также проверьте appl.ttsLevel(). Класс должен правильно с транзакциями работать (открывать-закрывать).

Посмотрите как AIF вызывает ваш метод в AifWcfProcessor, сделайте трейс.
И как транзакция открывается/закрывается -

AifRequestProcessor.processWcfRequest - AIF делает ttsbegin в конце
AifRequestProcessor.processWcfResponse - AIF делает ttscommit в начале

Имейте ввиду что AIF логика может быть разная для Basic и Enhanced портов.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
За это сообщение автора поблагодарили: Logger (1), sgt.Pepper (1), A_BAS (2).
Старый 19.11.2015, 15:24   #5  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
В методе который выполняется AIF запускайте thread.
Старый 26.04.2016, 20:32   #6  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
Если кому интересно, нашел решение проблемы (спасибо подсказке Alex_KD).

При вызове сервиса AIF создает "глобальную" транзакцию, соттветственно если что-то случается в самом сервисе, все try-catch блоки самого сервиса просто игнорируются и идут выше в обработчики AIF, где собственно было начало транзакции. Все попытки использовать catch Error, ClrError, Internal и просто catch не увенчались успехом.

Что сделано:
в точке входа сервиса сделал проверку на уровень tts и сразу сделал ttscommit.

X++:
ttsInitialLevel = appl.ttsLevel();
if(ttsInitialLevel > 0)
{
    ttscommit;
    ttsbegin;
}
...
Дальше открыл свою транзакцию и запускаю логику. Если код где-то валится, то управление уже не передается выше в AIF, а срабатывают свои обработчики.

После отработки метода делаю ttscommit своей транзакции, и перед возвратом создаю новую.
X++:
if(ttsInitialLevel >0 && appl.ttsLevel() == 0)
ttsbegin;
return something
Так можно обмануть систему.

Последний раз редактировалось sgt.Pepper; 26.04.2016 в 20:43.
За это сообщение автора поблагодарили: gl00mie (2).
Старый 27.04.2016, 13:26   #7  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от sgt.Pepper Посмотреть сообщение
Если кому интересно, нашел решение проблемы (спасибо подсказке Alex_KD)...
Немного доработайте свой код, т.к. ttsLevel может быть и > 1
За это сообщение автора поблагодарили: gl00mie (2).
Теги
aif, ax2012, user connection

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов веб-сервиса Ax 2012 R3 из 1C 8.2 Bega DAX: Программирование 8 06.02.2015 13:30
Вызов Web-сервиса из Ax2009 samolalex DAX: Программирование 6 21.11.2012 14:50
daxdilip: How to: Configure Dynamics AX AIF Services to listen for SSL Requests (https) Blog bot DAX Blogs 0 23.01.2011 10:12
Dianne Siebold: AIF Top Ten Blog bot DAX Blogs 1 22.04.2008 11:19
Вызов веб-сервиса из аксапты dzeaman DAX: Программирование 18 24.12.2005 13:22

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:44.