я тут думал-подумал...
очередной раз упёршись рогом..., имеем программу/код, имеем домину/нотес, хотим запустить код
НО платформа LDN, в силу многих причин, сделать этого не может (полноценно) в моём случае - это java
Проблемы с жвм домины я пересказывать здесь не буду
Ряд ограничений:
- никаких аппсерверов
- получить данные по результатам работы кода в домину (например в агент)
Решение созрело неожиданно - программа может выдавать результаты в консоль. С т.з. обмена данными - это ничем не отличается от того же http запроса.
Т.е. мы пишем в консоль, а домина забирает из неё результат, дело за малым - контролируемый запуск и парсинг результатов
решать будем... в джава (доминошной)
важный кусок про кодировку!
нам расколоть его поможет киножурнал кусок
хы - скажут мне - удивил запуском программы
тут есть тонкость - получение stdout процесса
забегая вперед - из ЛС "тоже хачу"
придётся напрячь программную мысль и
в каментах вариант без разрыва цикла и он в ЛС не подойдёт - "мыто хочем" не массив (который может быть немерянным) получить, а поток и здесь его и получаем, а итерацию вынесем на уровень ЛС
мы уже почти получили желаемое вот она (подготовка)
Потенциально (при больших перерывах в получении из потока) - рискуем схватить таймаут в приложении (а именно его мы запустили выше)
Но не будем доводить до абсурда
Можно заметить - regex - именно оно позволит фильтровать "нужное" из потока (для отладки - нам и весь поток нужен)
ответный кусок в ЛС
типа УРА
бонусом мы получили замену неработающей регулярно Java Debug Console (при запущенном дизигнере)
по регэкспам - пригодится "отрицание"
хавалук
очередной раз упёршись рогом..., имеем программу/код, имеем домину/нотес, хотим запустить код
НО платформа LDN, в силу многих причин, сделать этого не может (полноценно) в моём случае - это java
Проблемы с жвм домины я пересказывать здесь не буду
Ряд ограничений:
- никаких аппсерверов
- получить данные по результатам работы кода в домину (например в агент)
Решение созрело неожиданно - программа может выдавать результаты в консоль. С т.з. обмена данными - это ничем не отличается от того же http запроса.
Т.е. мы пишем в консоль, а домина забирает из неё результат, дело за малым - контролируемый запуск и парсинг результатов
решать будем... в джава (доминошной)
важный кусок про кодировку!
Java:
String launch=javaApp;
launch=javaApp + jvmparams +" -jar " + classPath +jar;
System.out.println("launch:"+launch);
/* call the Hello class */
try
{
theProcess = Runtime.getRuntime().exec(launch);
/*OutputStream strmOut=theProcess.getOutputStream();*/
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
return theProcess;
тут есть тонкость - получение stdout процесса
theProcess.getInputStream()
и опять возможен скепсис - как нам это контролировать?забегая вперед - из ЛС "тоже хачу"
придётся напрячь программную мысль и
Java:
static void printProcessInput(InputStream is, boolean bOutSuppress){
Scanner scan = getScanner(is);
System.out.println("! *Console output:" + !bOutSuppress);
for (ScanResult res;(res=intercept(scan,".*",bOutSuppress)).isHasNext();){
}
/*
while(scan.hasNextLine()){
String line = scan.nextLine();
if (!bOutSuppress)
System.out.println(line);
}
*/ }
мы уже почти получили желаемое вот она (подготовка)
Java:
public static ScanResult intercept(Scanner scan, String regex, boolean bOutSuppress){
boolean hasNext=scan.hasNextLine();
ScanResult res=new ScanResult("",hasNext);
if(hasNext){
String s = scan.nextLine();
res.setText(s);
if (!bOutSuppress)
System.out.println(s);
Pattern p= Pattern.compile(regex,Pattern.CASE_INSENSITIVE );
Matcher matcher = p.matcher(s);
if (matcher.find())res.setRes(s);
}
return res;
}
Но не будем доводить до абсурда
Можно заметить - regex - именно оно позволит фильтровать "нужное" из потока (для отладки - нам и весь поток нужен)
ответный кусок в ЛС
Visual Basic:
Function testProc()
On Error GoTo ErrH
GoTo Begin
ErrH:
Error Err, RaiseError
Begin:
Dim theProcess As JavaObject, scanRes As JavaObject, scan As Javaobject, errScan As Javaobject
Set theProcess = getRuntime(me.userJDK, me.classPath, me.jar, me.jvmparams)
Set scan=rtuObj.getScanner(theProcess.getInputStream())
Set errScan=rtuObj.getScanner(theProcess.getErrorStream())
Dim res() As String, cnt As Long
'scanning program consiole output
Do
'set filter for lines to be accepted, true for skiping stdout from java
Set scanRes=rtuObj.intercept(scan, regexTag, Not me.isDebug)
'print programm output here
DebugInfo scanRes.getText()
'fillout array by filter
If Len(scanRes.getRes())>0 Then
Stop
ReDim Preserve res(cnt) As String
res(cnt)=StrRight(scanRes.getRes(),stripTag)
cnt=cnt+1
End If
'break when no lines
If Not scanRes.isHasNext() Then Exit Do
'Stop
Loop
Stop
'print out error stream (stderr) if exists
Dim bErrHeader As Boolean
bErrHeader=True
Do
Set scanRes=rtuObj.intercept(errScan, {.+}, Not me.isDebug)
Dim txt As String
txt=scanRes.getText()
If (Len(txt)>0) And bErrHeader Then
DebugInfo {*** Errors ***}
bErrHeader=False
End If
DebugInfo txt
If Not scanRes.isHasNext() Then Exit Do
Stop
Loop
testProc=(res)
End Function
бонусом мы получили замену неработающей регулярно Java Debug Console (при запущенном дизигнере)
по регэкспам - пригодится "отрицание"
хавалук
Ссылка скрыта от гостей
Последнее редактирование: