发布 / 2006-09-29 12:13
于 / IBM大型机
文 / 王路
终于回到武汉,谢谢大家在这几天在我不在德时候对对我的帮助,非常的感谢。
发布 / 2006-09-25 14:54
于 / IBM大型机
文 / XingBin
王路今天去北京面试,再此祝他一路顺风、旅途愉快!
发布 / 2006-09-25 07:34
于 / IBM大型机
文 / 王路
今天去中科院软件所面试,呵呵,希望那地方能带给好运。
该看的东西还没有看完,觉得过程挺麻烦的,而且时间特别紧,所有的事情一天全部搞定,包括体检,英语,笔试,面试,上机。还是有些紧张的,呵呵。
发布 / 2006-09-18 07:50
于 / IBM大型机
文 / 王路
今天是国耻日,昨天和邢彬还有其他同学特意去露天电影院看了“东京审判“。感触还是蛮大的。
第一当时的中国虽然抗战胜利了,但是国际地位还是特别的低。第二对中国当时的外交官,法官,检查人员特别的佩服和敬仰,是他们用自己的行动,为中国人争会来本来属于我们的东西。
对电影的描写手法也觉得特别的新颖,以一个日本家庭为背景,反映了当时日本社会的状况。不过觉得曾志伟在里面演一名日本兵觉得怪怪的。可能是受他拍的“无间道“等电影的影响吧。
发布 / 2006-09-16 23:01
于 / IBM大型机
文 / 杨鹏飞
感觉好多天都没写博客了,开学了,的确挺忙的,先是课外劳动一周,接着就是两周的课程设计,好多事情要作啊,大机方面的事情就耽误了一下。博客现在也不热闹了,王路还时不时说一下。昨天大家商量了一下本周的事情,争取在月底把作的工作都联系起来,有的文档也要写的。大家努力啊!
发布 / 2006-09-15 17:20
于 / IBM大型机
文 / 王路
今天早上我们几个人做了个简短的讨论,商议了一下这个月我们的任务。
正如以前说的开学了,大家都很忙,考研,学业。。。。。。压力都很大的。大家肯定大部分精力是不会放在比赛上了。但是我们一定能坚持到最后的,将系统完成,写个perfect presentation。
发布 / 2006-09-13 23:35
于 / IBM大型机
文 / 王路
开学差不多两个星期了,我们的blog,变的不是那么热闹了。大家现在都很忙,都很紧。学校的课程还很多,我们的比赛的东西还远没有弄好。最近两周我们有很多的课程设计要做。
这个星期周末我们将对九月份下半期的一些竞赛的事项安排一下,便于以后事情的开展。不管多么忙,我们一定会尽最大的努力,将我们的竞赛进行到底。
到了十月份,我们用于竞赛的时间,将进一步缩水,因为到那时将进入考研准备的最后阶段了,又有学校课程学业的压力,大家到时将忙的更加不可开交的,所以虽然九月份还只有一半,我们一定要对大机竞赛多做些事情的。
发布 / 2006-09-07 23:15
于 / IBM大型机
文 / 杨鹏飞
劳动了几天了,每天跑到主校区去搞学校环境,其实没多少活的,但是还是觉得挺累的。大四了,同学们都在为将来做准备,考研的,找工作的,一批一批的,各人志向不同,都有自己的生活,祝愿大家过好现在的每一天。晚上整理一下文档,还有许多事情要做……
发布 / 2006-09-07 22:27
于 / IBM大型机
文 / XingBin
目前在金融计算领域,核心计算机系统大多使用运行OS/390操作系统的IBM系列大型机,而OS/390环境下最重要的子系统便是JESJob Entry Subsystem,作业登录子系统,系统中所有作业的调度、输入输出信息等均是通过JES进行管理的。JES的优点是效率高、灵活性强,缺点则是过于专业化。因此,使JES实现可编程化,就成为所有需要进行JES操作的应用核心问题。从传统上讲,这需要使用汇编语言编写JES Exit等方式去改变JES的运作,同时提供相应的应用程序编程接口API,Application Programming Interface。但这种做法不仅工程浩大,同时还由于涉及OS/390核心子模块的修改,可能使得JES无法运作,甚至导致整个主机系统瘫痪。因此,许多相关的应用便由于遇到JES信息采集的难题而半途而废。对此,本文介绍一种采用高级语言REXX,通过调用SDSFSystem Display and Search Facility,系统显示和搜索工具)服务程序实现JES信息采集的方法。
_ueditor_page_break_tag_
一、关于REXX for OS/390
REXX(REstructured eXtended eXecutor,重构扩展执行语言)是一种高级语言,是一种类似PL/I的通用编程语言,它包含常用的IF、SELECT、DO WHILE、 LEAVE等语句以及若干内置函数,尤其适合编制命令过程、用户自定义宏、个人计算以及应用程序的原型。就REXX for OS/390而言,语言本身除提供了如数值计算、字符处理、流程控制等功能外,还提供了调用其他运行于OS/390环境下的程序的功能。正是由于这种调用功能的存在,便产生了以可编程方式执行包括可访问JES在内的SDSF等程序的可能性。
二、关于SDSF
SDSF在OS/390中是一个标配的用于访问JES的工具,通常我们在主画面的面板中可以看到调用它的途径。通过SDSF,用户可以查看并处理JES中各种队列(输入、输出等)中的作业,配置打印机以及实现控制Initiator等功能。用户通常需要采集位于输出队列中的作业的输出结果,而通过SDSF,用户可以看到一个作业的状态是尚未运行、正在运行还是运行完成。一旦运行完成或作业出现错误而中断,由用户作业写出的或者系统给出的相关信息,都将记录在SYSPRINT、SYSOUT等输出段中供用户察看。
三、JES信息采集的具体实现
以下从应用层的角度,介绍REXX是如何调用SDSF服务程序与JES实现交互的。
1.调用语句及调用参数
要使用REXX进行程序的调用,需要用到相应的LINKPGM命令,调用格式为ADDRESS LINKPGM“程序名参数”,例如:
ADDRESS LINKPGM ″SDSF PARM″
本语句说明需要调用名为SDSF的程序,并且需要带入参数,参数的内容放在PARM变量中。相应的程序需要位于系统默认搜索的可执行程序库中,否则将返回无效环境或程序错误。由于调用的是SDSF程序,根据其要求,应该带入的参数为输出虚拟屏幕的行数以及列数,例如:
PARM1= ″/++20500″
该语句说明在调用时希望将输出的虚拟屏幕设置为20(行)×500(列)的格式。
2.被调用的程序
可以调用的程序为ISFAFD或SDSF,两者功能类似,但有少许不同。SDSF是传统的访问JES的程序而ISFAFD较SDSF而言,有以下特点:
(1)命令字符不需要以成功的FIND为前提;
(2)支持功能键(PF Keys);
(3)输出结果必须用AFD REFRESH命令刷新;
(4)可以输出在使用SDSF情况下被解释后输出的属性字节(例如某个数入场的颜色、输入条件等);
(5)支持以/为开头/为结尾的注释。
具体是使用SDSF还是ISFAFD,由用户根据自身的需要进行选择。对于初次以程序调用方式访问JES的用户而言,建议采用SDSF,因为SDSF的输出与用户在TSO/E画面中得到的结果是完全一致的。
3.输入输出
SDSF程序的运行,除了指定虚拟屏幕大小参数以外,还需要预先申明ISFIN和ISFOUT这两个文件。
(1)输入文件ISFIN
作为SDSF的输入,该文件主要用来存放模拟用户实际使用SDSF环境时输入的各种命令的列表。例如,在SDSF中需要输入“owner user001”再限制只输出以job开头的作业“pre job”,输入文件中包括这两行内容即可。同时,需要在REXX中使用ALLOC指令说明该输入文件,具体语句格式如:
″ALLOC DDISFINNEW REUSE UNIT3390″,
″RECFMFB LRECL80 BLKSIZE27920 SPACE1 TRACKS″
语句中需要注意的是文件记录的格式应该设置为RECFMFB,即定长块的格式;同时设置记录长度为LRECL80,即每行80个字符。
(2)输出文件ISFOUT
作为SDSF的输出,该文件主要用来存放使用SDSF时输出的虚拟屏幕的内容。例如,由SDSF输出一个标准的SDSF屏幕,则输出到ISFOUT文件当中的内容也就是用户直接使用SDSF所看到的内容。和输入文件一样,在REXX中也需要使用ALLOC指令说明该输出文件,具体语句格式如下例:
″ALLOC DDISFOUT NEW REUSE UNIT3390″
″RECFMFBA LRECL301 BLKSIZE27993 SPACE1 CYL″
语句中需要注意的是文件记录的格式应该设置为RECFMF,B,A,即定长块、包含打印控制符的格式;同时设置记录长度为LRECL301,即每行输出301个字符(根据输出的最长行的大小决定)。另外,如果在调用SDSF时带入的虚拟屏幕尺寸参数小于输出文件中定义的值时,输出文件的内容将自动换行,导致内容错位。
4.API的封装
为给REXX语言提供编程接口,用户可以直接通过编制REXX代码,形成函数或子程序,供其他模块调用。模块化是API实现的推荐方式,一个相对独立的功能可以封装为一个单独的REXX子程序,存在于程序库中,随时被上级模块调用并返回其执行的结果。一个模块或子程序实现一个特定的功能,这样的逻辑思路以及所实现的功能都相当清晰,便于调用者进行操作以及对可能的后续模块功能进行修正等。
5.应用实例
通过SDSF采集作业运行时间,实例中包含总控模块部分代码、GETINFO、GETRTIME模块以及执行总控模块的JCL语句。
(1)总控模块
总控模块从参数文件中取得需要在JES输出队列中察看执行时间的作业名,交给GETINFO模块,从而得到相关该作业的JOBID、进入系统日期时间、结束日期时间、返回码等信息。通过PARSE VAR语句将各种信息分别赋值到相应变量中等待处理,并完成显示或记录到文件等必要的操作。
核心代码如下:
R=GETINFOJOBNAME /*调用GETINFO模块*/
PARSE VAR R JOBNAME1 JOBID RDTIME RDDATE ENDTIME ENDDATE MAXRC
(2)GETINFO模块
本模块实现访问SDSF并返回某作业名在队列中最后一次运行后产生的JOBID、进入系统日期时间、结束日期时间、返回码等信息。模块中分配了ISFIN、ISFOUT,并采用直接将QUEUE中的内容写入ISFIN的方式。
/*REXX /
PARSE ARG JOBNAME /*取得作业名作为参数*/
DO WHILE LENGTHJOBNAME<8JOBNAME=JOBNAME||″ ″END
QUEUE ″ST″
QUEUE ″PRE ″
QUEUE ″OWNER ″
QUEUE ″﹖″
QUEUE ″F '″JOBNAME″' LAST″
QUEUE ″″ /*QUEUE的结束*/
″ALLOC DDISFIN NEW REUSE UNIT3390″
″RECFMFB LRECL80 BLKSIZE27920 SPACE1 TRACKS″
″ALLOC DDISFOUT NEW REUSE UNIT3390″
″RECFMFBA LRECL301 BLKSIZE27993 SPACE1 CYL″
″EXECIO DISKW ISFIN FINIS″
/将QUEUE中内容写入ISFIN /
PARM1= ″ / ++20500″ /设置虚拟屏幕大小/
ADDRESS LINKPGM ″SDSF PARM1″
/*调用SDSF*/
"EXECIO DISKR ISFOUTSTEM TMPLINE. FINIS″
/*将ISFOUT读到数组中以备处理*/
FREE DDISFINISFOUT″
LINE1=103LINE2=104 /*这个值与PARM值有关*/
LENJOBID=8;LENMAXRC=10;LENRDTIME=8;LENRDDATE=8;LENENDTIME=8
LENENDDATE=8LENJOBNAME=8
POSJOBNAME=INDEXTMPLINE.LINE1″JOBNAME″
/*取得作业名列*/
POSJOBID=INDEXTMPLINE.LINE1″JOBID″)
/*取得JOBID列*/
POSMAXRC=INDEXTMPLINE.LINE1″MAX-RC″
/*取得返回码列*/
POSRDTIME=INDEXTMPLINE.LINE1″RD-TIME″)
/*取入系统时间列*/
POSRDDATE=INDEX(TMPLINE.LINE1,"RD-DATE")
/*取入系统日期列*/
POSENDTIME=INDEXTMPLINE.LINE1″END-TIME″)
/*取结束时间列*/
POSENDDATE=INDEXTMPLINE.LINE1″END-DATE″)
/*取结束日期列*/
RDTIME=STRIPSUBSTRTMPLINE.LINE2POSRDTIMELENRDTIME
IF LENGTHRDTIME=7THEN RDTIME=″0″||RDTIME RDDATE=STRIPSUBSTRTMPLINE.LINE2POSRDDATELENRDDATE
ENDTIME=STRIPSUBSTRTMPLINE.LINE2POSENDTIMELENENDTIME
IF LENGTHENDTIME=7 THEN ENDTIME=″0″||ENDTIME
ENDDATE=STRIPSUBSTRTMPLINE.LINE2POSENDDATELENENDDATE
MAXRC=STRIPSUBSTRTMPLINE.LINE2POSMAXRCLENMAXRC
JOBID=STRIPSUBSTRTMPLINE.LINE2POSJOBIDLENJOBID
JOBNAME1=STRIPSUBSTRTMPLINE.LINE2POSJOBNAMELENJOBNAME
/*根据各个列位置以及长度,取出相应的值*/
A=JOBNAME1 JOBID RDTIME RDDATE ENDTIME ENDDATE MAXRC
RETURN A /*返回总控模块*/
本模块为实际执行SDSF的模块,从应用级实现了通过REXX采集JES信息的目的,通过对QUEUE内容进行编程,可以实现对JES的可编程化访问。
(3)执行时间计算模块RXGRTIME
/* REXX /
/* this routine returns the exetime of a job /
/* in the format of dayshoursminutesseconds /
PARSE ARG rddate rdtime enddate endtime if rddate=″″ | rdtime=″″ | enddate=″″ | endtime=″″ then return ″ERROR″
if rddate>enddate | rddate=enddate & rdtime>endtime then do
return ″UNKNOWN″
end if lengthrdtime=7then rdtime=″0″||rdtime if lengthendtime=7 then endtime=″0″||endtime
y1=substrrddate32
y2=substrenddate32
d1=substrrddate63
d2=substrenddate63
h1=substrrdtime12
h2=substrendtime12
m1=substrrdtime42
m2=substrendtime42
s1=substrrdtime72
s2=substrendtime72
baseday1=DATE'B'y1||d1'J'
baseday2=DATE'B'y2||d2'J'
days=baseday2-baseday1
hours=days24+h2-h1
mins=hours60+m2-m1
secs=mins60+s2-s1
mins=secs % 60
hours=mins % 60
days=hours% 24
hour1=hours-24days
min1=mins -60hour1
sec1=secs -60mins
jobexetime=sec1″ seconds″
if min1>0 then jobexetime=min1″ minutes ″||jobexetime if hour1>0 then jobexetime=hour1″ hours ″||jobexetime if days>0 then jobexetime=days″ days ″||jobexetime return jobexetime
需要注意的是,由于SDSF中返回的作业时间均为Julian日期(如2004.366代表2004年12月31日),其他格式的日期要转换为Julian日期,一致后才能进行相应的计算。具体的日期转换需要使用DATE函数。
(4)执行以上REXX程序的JCL样例
//EXEJOB1 JOB 'ACCOUNTDEPTBLDG''PROGRAMMER NAME'
//CLASS=BMSGCLASS=XMSGLEVEL=11NOTIFY=&SYSUID
//RUN EXEC PGM=IKJEFT01DYNAMNBR=30REGION=60M
//SYSEXEC DD DSN=REXX所在库DISP=SHR
//SYSTSPRT DD SYSOUT=
//SYSTSIN DD *
%总控模块名称
/*
//
通过在OS/390环境中提交JCL,可以执行总控模块,从而达到解析JES输出队列内容、统计作业运行时间的目的。
四、结束语
本文通过对REXX、SDSF以及相关JES访问方式的简要描述,以一个采集作业运行时间的事件为例,介绍了从应用级进行JES可编程化及其信息采集的方法。希望以这种抛砖引玉的方式,使广大主机技术人员更积极地参与到金融计算系统的技术革新中,不断寻求新的思路,解决实际工作中遇到的难题,进一步提高我国金融计算系统的技术应用水平。
http://www.fcc.com.cn/magazine/shownews.asp?newsid=710
发布 / 2006-09-07 10:54
于 / IBM大型机
文 / 王路
开学了。我们第一周劳动。以前总是看见学长们劳动,我总是想着还远着呢!可是how time flies ,现在轮到我们了。大四了!大学的最后一年。在这一年里面,我们要经历很多,又到了一个人生的转折的地方。好多人都想着考研。我们有个同学成绩很好,他说他要去找工作,很多人会吃惊的说一句:“你找工作!”其实我觉得这个没什么好奇怪的,每个人都有自己的想法,自己认为正确的路。只要认认真真地坚持不懈的走下去,一定会达到预期的目的。
这几天我们在忙劳动,用在比赛的时间可以说很少,接下来的时间我们的事情还很多,要继续将系统完成,完成文档。。。。。。