Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Как буферизировать вывод сообщений через произвольный глобал (но не ^SPOOL)?  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
Добрый день.
Уважаемые коллеги подскажите, пожалуйста, как можно буферизировать выводимое сообщение через произвольный глобал.
 
  ; Запись 
   open 2:($job)
   use 2:($job)
   w "Сообщение, попадающее в буфер (Глобал ^SPOOL)",!
   close 2:($job)
   ; Чтение
   s ind="",LastJobId=$job
   for {
     s ind=$o(^SPOOL(LastJobId,ind)) 
     q:ind=""
     continue:ind=2147483647
     w ind_": "_^SPOOL(LastJobId,ind)
     k ^SPOOL(LastJobId,ind)
   } 

Уточнение вопроса: Существует ли механизм выбора произвольного глобала в место ^SPOOL Область применения :
Запущен процесс через JOB c внутреннем бесконечным циклом . Из другого процесса передаются команды Cache` $system.Event.Signal (http://www.sql.ru/forum/1293117/podkluchitsya-k-deystvuushhemu-processu-cherez-veb-zapros-zapustit-komandu-i-otkluchitsya
) .
Результат выполнения забираем из глобала.
Если этот механизм реализовать через ^SPOOL , тогда при переключении области имен, результат выполнения будет помещен в новую область, а Повторное подключение будет производится в старую область , в которой ^SPOOL не заполнен.
В прикреплённом файле пример реализации JS библиотеки (пример применения) , позволяющая работать пользователю в рамках одного процесса. Все запросы (#server()# и #call()# )отправленные с вэб страницы , будут выполнены в одном и том же процессе. Подход не совсем стандартный, и я уверен, что найдутся критики , но суть поднятой темы не в этом.
Стоит упомянуть, что реализация завязана на ^SPOOL , от чего хотелось бы уйти.
Буду очень признателен любой помощи в решении этой задачи.

К сообщению приложен файл (HTML.WorkStation.js.xml - 30Kb) cкачать
31 май 18, 07:15    [21456027]     Ответить | Цитировать Сообщить модератору
 Re: Как буферизировать вывод сообщений через произвольный глобал (но не ^SPOOL)?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3771
В силу своей ограниченности не могу понять главного - ЗАЧЕМ? Ну пиши просто в какой тебе удобно глобал, если хочется. Зачем ТАК извращаться?
Тут даже выражение "зачем делать просто, если можно сложно" не достаточно полно описывает ситуацию. Это оверинжиниринг, доведенный до абсурда.
31 май 18, 12:55    [21457138]     Ответить | Цитировать Сообщить модератору
 Re: Как буферизировать вывод сообщений через произвольный глобал (но не ^SPOOL)?  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1162
MyasnikovIA,

Можно описать как-бы свой девайс, в обработчиках указать что именно, в какой глобал...
Cache': перехват текущего устройства
31 май 18, 14:37    [21457692]     Ответить | Цитировать Сообщить модератору
 Re: Как буферизировать вывод сообщений через произвольный глобал (но не ^SPOOL)?  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
Большое спасибо всем, кто откликнулся на мой вопрос. Как публично так и в приватных сообщениях. Для того, чтобы опробовать все предложенные варианты понадобится не много времени. Но уже готово одно решение, которое удовлетворяет запросам, озвученным в теме.

Я переработал и немного упростил библиотечку, которая позволяет работать пользователю через ВэбБраузер в рамках одного процесса ($JOB). Конечно это еще не конечный вариант, и понадобится доработка, но в целом суть останется прежней.
Кому интересно могут посмотреть вложенный файл с библиотекой и примером применения. Но если коротко , то на данный момент применил следующий вариант:
    * * *
    set %LastIO=$IO
    set %XDEV="|XDEV|"_+$j
    open %XDEV:($ZF(-6,$$$XSLTLibrary,12):"":"S":/HOSTNAME="XSLT":/IOT=$s($$$IsUnicode:"UTF8",1:"RAW"):/IBU=32768:/OBU=32768)
    u %XDEV
    * * *
     w "Вывод команд, выполнение класс методов , и т. д.",!
    * * *
   // Чтение в буфер
    write *-3
      for {
         read %ReadUserBuffer:0
         quit:'$l(%ReadUserBuffer)
         set @..#GlobalMessage@(%ClientIP,%ParentClass,"buff")=$i(@..#GlobalMessage@(%ClientIP,%ParentClass,"buff"))
         set @..#GlobalMessage@(%ClientIP,%ParentClass,"buff",@..#GlobalMessage@(%ClientIP,%ParentClass,"buff"))=%ReadUserBuffer
      }
      k %ReadUserBuffer
      
    

И еще раз всем большое спасибо. Я получил очень ценную информацию.

К сообщению приложен файл (HTML.OneJob.js.xml - 21Kb) cкачать
1 июн 18, 15:15    [21461647]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить