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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.10.2009, 12:47   #1  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
одновременный запуск 2 runBuf - ошибка
ax3sp3:
столкнулся с проблемкой:
есть серверный класс запускающий код через runbuf , при одновременном запуске в 2х клиентах runbuf функций использующих одинаковые таблицы (другое не проверял) оба runbuf слетают.
для примера сделал 2 серверных стат метода (переменные обозвал по разному) и вызывал из 2х клиентов - результат слёт обоих:

первый
X++:
s1='str convert1(str _input, Common _parent, Args _args)\n'+
'{\n'+
'inventtable      itab1;\n'+
';\n'+
'    return _input;\n'+
'}\n';
второй
X++:
s1='str convert(str input, Common parent, Args args)\n'+
'{\n'+
'inventtable      itab;\n'+
';\n'+
'    return input;\n'+
'}\n';
может кто сталкивался и знает решение?
__________________
--- SHiSHok
Старый 27.10.2009, 13:09   #2  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
все гораздо проще: просто 2 runbuf в одном процессе на сервере не исполняются нормально. на клиенте все хорошо (в разных процессах),а на сервере даже не важно что табличные переменные одного типа объявлены (переменные усугубляют).
__________________
--- SHiSHok
Старый 27.10.2009, 13:10   #3  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Что-то не очень понятен тайный смысл таких методов? Или это предельно упрощенные для теста и все равно падает?

p.s. Кстати, если перед строковой константой поставить собаку "@", то можно избавиться от ручного перевода строк \n. Удобно например писать SQL запросы без многочисленных конкатенаций.

X++:
str     strtest = @"

    InventTable     inventTable;

    SELECT * FROM SOMETABLE
        WHERE A = B;

    return inventTable;
    ";
    ;

    info(strtest);
За это сообщение автора поблагодарили: Zabr (2).
Старый 27.10.2009, 13:13   #4  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Цитата:
Сообщение от Lemming Посмотреть сообщение
Что-то не очень понятен тайный смысл таких методов?
можно слееп добавить чтоб в ранбуфе подольше висел. именно тестовый "пустой" кусок .
__________________
--- SHiSHok
Старый 27.10.2009, 13:27   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Да, не работает одновременно. Я когда то давно писал про это. Если очень нужно - используйте XppCompiler - он избавлен от этого недостатка.

Хотя, на мой взгляд, динамический код - зло и бледная попытка обойтись в языке без полноценных макросов.
Старый 27.10.2009, 14:43   #6  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
у нас активно используется в Группах Определения (sysExpImpGroup)

так что, никак нельзя этот "ньюанс" победить?
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 27.10.2009 в 14:46.
Старый 27.10.2009, 23:52   #7  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Есть вообщето идея:
перебросить исполнение runbuf на клиента, только вот какой трафик это породит и какие временные затраты будут? Но по крайней мере ситуация непредвиденного "слёта" решена - каждый клиент свой runbuf сам исполнят.
__________________
--- SHiSHok
Старый 28.10.2009, 17:04   #8  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
решение проблемы запусков 2 runbuf в одном процессе
Идею реализовал и оттестировал. вкратце:
сделал стат методы класса test, из джобиков вызывал testRunBufCS изменяя модификатор client/server метода RunBufT (метод вызывает тестовый runBuf).
testRunBufCS1 - серверная реализация тестового механизма для тестирования 2х одновременных серверных исполнений.

Результаты одновременного запуска testRunBufCS и testRunBufCS1 в разных клиентах:
1) при запуске тестов с модификаторами server как и ожидалось произошел сбой.
2) в RunBufT ставим модификатор client - при запуске тестов все отработало без ошибок (1 runBuf исполнился в серверном процессе, 2-й в клиентском)

Результаты задержек при исполнении runBuf на клиенте:
1) RunBufT на сервере - 18 сек
2) RunBufT на клиенте - 37 сек

Т.о. задержка при передаче исполнения клиенту возрастает в 2 раза при данной реализации вызова runBuf.

X++:
static server void testRunBufCS()
{
    inventTable it;
    str         s;
    int         cnt;
;
    timeStamp();

    while select it
    {
        s=test::RunBufT(it.ItemId, it);
        cnt++;
    }

    info(int2str(cnt));
    timeStamp();
}
X++:
static client str RunBufT(str _s, common _c)
{
    str     expr;
;
expr=@'str convert2(str _s, common _c)
{
    inventTable         it = _c;
    inventItemGroup     iig = inventItemGroup::find(it.ItemGroupId);
;
    return _s+iig.Name;
}';
   return runbuf(expr,_s,_c);
}
X++:
static server void testRunBufCS1()
{
    inventTable it;
    str         s;
    int         cnt;
    str         expr;
;
expr=@'str convert2(str _s, common _c)
{
    inventTable         it = _c;
    inventItemGroup     iig = inventItemGroup::find(it.ItemGroupId);
;
    return _s+iig.Name;
}';
    timeStamp();

    while select it
    {
        s=runbuf(expr,it.ItemId, it);
        cnt++;
    }

    info(int2str(cnt));
    timeStamp();
}

PS: к слову, при реализации RunBufT как static server str RunBufT(str _s, common _c, common _c1, common _c2 ), время выполнеия у меня следующее: 47 / 79 (сервер/клиент соответственно)
__________________
--- SHiSHok
Старый 29.10.2009, 23:29   #9  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Идею реализовал и оттестировал. вкратце:
Я, кстати, не понял, почему предложенный мною вариант с XppCompiler Вам не подошел. Он прекрасно работает на сервере и избавлен он недостатков runBuf.
Старый 30.10.2009, 10:06   #10  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Цитата:
Сообщение от db Посмотреть сообщение
Я не знаю ваш это случай или нет, но память при работе с XppComiler (он же runbuf) течет замечательно.
утечка памяти в аксапта

таки течет в XppComiler, а runBuf нет.
__________________
--- SHiSHok
Теги
runbuf

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка (?) при печати приходного ордера в DAX 4.0 SP2 Ivanhoe DAX: Программирование 7 19.01.2021 14:13
Ошибка в логе при установке клиента AX 2009 sao DAX: Администрирование 9 04.02.2010 11:56
Ошибка в формате числа. 36AC DAX: Программирование 7 19.10.2006 10:04
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Функция RunBuf Maxim Gorbunov DAX: База знаний и проекты 0 27.11.2001 17:15
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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