27.10.2009, 12:47 | #1 |
Участник
|
одновременный запуск 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 |
Участник
|
все гораздо проще: просто 2 runbuf в одном процессе на сервере не исполняются нормально. на клиенте все хорошо (в разных процессах),а на сервере даже не важно что табличные переменные одного типа объявлены (переменные усугубляют).
__________________
--- SHiSHok |
|
27.10.2009, 13:10 | #3 |
Участник
|
Что-то не очень понятен тайный смысл таких методов? Или это предельно упрощенные для теста и все равно падает?
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 |
|
27.10.2009, 13:27 | #5 |
Moderator
|
Да, не работает одновременно. Я когда то давно писал про это. Если очень нужно - используйте XppCompiler - он избавлен от этого недостатка.
Хотя, на мой взгляд, динамический код - зло и бледная попытка обойтись в языке без полноценных макросов. |
|
27.10.2009, 14:43 | #6 |
Участник
|
у нас активно используется в Группах Определения (sysExpImpGroup)
так что, никак нельзя этот "ньюанс" победить?
__________________
--- SHiSHok Последний раз редактировалось SHiSHok; 27.10.2009 в 14:46. |
|
27.10.2009, 23:52 | #7 |
Участник
|
Есть вообщето идея:
перебросить исполнение runbuf на клиента, только вот какой трафик это породит и какие временные затраты будут? Но по крайней мере ситуация непредвиденного "слёта" решена - каждый клиент свой runbuf сам исполнят.
__________________
--- SHiSHok |
|
28.10.2009, 17:04 | #8 |
Участник
|
решение проблемы запусков 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 |
Moderator
|
Цитата:
Идею реализовал и оттестировал. вкратце:
|
|
30.10.2009, 10:06 | #10 |
Участник
|
__________________
--- SHiSHok |
|