邢彬 /* XingBin.net */
XING Bin, a Coder, Geek, Railfan, and Outdoors Fan
  • home
  • 邢彬MYSELF
  • 微博TWEET
  • 作品WORKS
  • 光影GALLERY
  • 户外OUTDOOR
  • 视频VIDEOS
  • 留言MESSAGE
  • 0310
  • face

    IBM大型机

    发布 / 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环境下最重要的子系统便是JESJob Entry Subsystem,作业登录子系统,系统中所有作业的调度、输入输出信息等均是通过JES进行管理的。JES的优点是效率高、灵活性强,缺点则是过于专业化。因此,使JES实现可编程化,就成为所有需要进行JES操作的应用核心问题。从传统上讲,这需要使用汇编语言编写JES Exit等方式去改变JES的运作,同时提供相应的应用程序编程接口API,Application Programming Interface。但这种做法不仅工程浩大,同时还由于涉及OS/390核心子模块的修改,可能使得JES无法运作,甚至导致整个主机系统瘫痪。因此,许多相关的应用便由于遇到JES信息采集的难题而半途而废。对此,本文介绍一种采用高级语言REXX,通过调用SDSFSystem 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= ″/++20500″
    该语句说明在调用时希望将输出的虚拟屏幕设置为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 DDISFINNEW REUSE UNIT3390″,
    ″RECFMFB LRECL80 BLKSIZE27920 SPACE1 TRACKS″
    语句中需要注意的是文件记录的格式应该设置为RECFMFB,即定长块的格式;同时设置记录长度为LRECL80,即每行80个字符。
    (2)输出文件ISFOUT
    作为SDSF的输出,该文件主要用来存放使用SDSF时输出的虚拟屏幕的内容。例如,由SDSF输出一个标准的SDSF屏幕,则输出到ISFOUT文件当中的内容也就是用户直接使用SDSF所看到的内容。和输入文件一样,在REXX中也需要使用ALLOC指令说明该输出文件,具体语句格式如下例:
    ″ALLOC DDISFOUT NEW REUSE UNIT3390″
    ″RECFMFBA LRECL301 BLKSIZE27993 SPACE1 CYL″      
    语句中需要注意的是文件记录的格式应该设置为RECFMF,B,A,即定长块、包含打印控制符的格式;同时设置记录长度为LRECL301,即每行输出301个字符(根据输出的最长行的大小决定)。另外,如果在调用SDSF时带入的虚拟屏幕尺寸参数小于输出文件中定义的值时,输出文件的内容将自动换行,导致内容错位。

    4.API的封装
    为给REXX语言提供编程接口,用户可以直接通过编制REXX代码,形成函数或子程序,供其他模块调用。模块化是API实现的推荐方式,一个相对独立的功能可以封装为一个单独的REXX子程序,存在于程序库中,随时被上级模块调用并返回其执行的结果。一个模块或子程序实现一个特定的功能,这样的逻辑思路以及所实现的功能都相当清晰,便于调用者进行操作以及对可能的后续模块功能进行修正等。

    5.应用实例
    通过SDSF采集作业运行时间,实例中包含总控模块部分代码、GETINFO、GETRTIME模块以及执行总控模块的JCL语句。
    (1)总控模块
    总控模块从参数文件中取得需要在JES输出队列中察看执行时间的作业名,交给GETINFO模块,从而得到相关该作业的JOBID、进入系统日期时间、结束日期时间、返回码等信息。通过PARSE VAR语句将各种信息分别赋值到相应变量中等待处理,并完成显示或记录到文件等必要的操作。
    核心代码如下:
    R=GETINFOJOBNAME /*调用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 LENGTHJOBNAME<8JOBNAME=JOBNAME||″ ″END              
    QUEUE ″ST″
    QUEUE ″PRE ″    
    QUEUE ″OWNER ″
    QUEUE ″﹖″
    QUEUE ″F '″JOBNAME″' LAST″
    QUEUE ″″ /*QUEUE的结束*/
     ″ALLOC DDISFIN  NEW REUSE UNIT3390″
    ″RECFMFB LRECL80 BLKSIZE27920 SPACE1 TRACKS″      
    ″ALLOC DDISFOUT NEW REUSE UNIT3390″
    ″RECFMFBA LRECL301 BLKSIZE27993 SPACE1 CYL″      
    ″EXECIO  DISKW ISFIN FINIS″
    /将QUEUE中内容写入ISFIN /
    PARM1= ″ / ++20500″    /设置虚拟屏幕大小/
    ADDRESS LINKPGM ″SDSF PARM1″  
    /*调用SDSF*/
    "EXECIO  DISKR ISFOUTSTEM TMPLINE. FINIS″  
    /*将ISFOUT读到数组中以备处理*/
    FREE DDISFINISFOUT″
    LINE1=103LINE2=104 /*这个值与PARM值有关*/
    LENJOBID=8;LENMAXRC=10;LENRDTIME=8;LENRDDATE=8;LENENDTIME=8  
    LENENDDATE=8LENJOBNAME=8
    POSJOBNAME=INDEXTMPLINE.LINE1″JOBNAME″
    /*取得作业名列*/
    POSJOBID=INDEXTMPLINE.LINE1″JOBID″)
    /*取得JOBID列*/
    POSMAXRC=INDEXTMPLINE.LINE1″MAX-RC″
    /*取得返回码列*/
    POSRDTIME=INDEXTMPLINE.LINE1″RD-TIME″)
    /*取入系统时间列*/
    POSRDDATE=INDEX(TMPLINE.LINE1,"RD-DATE")
    /*取入系统日期列*/
    POSENDTIME=INDEXTMPLINE.LINE1″END-TIME″)
    /*取结束时间列*/
    POSENDDATE=INDEXTMPLINE.LINE1″END-DATE″)
    /*取结束日期列*/
    RDTIME=STRIPSUBSTRTMPLINE.LINE2POSRDTIMELENRDTIME      
    IF LENGTHRDTIME=7THEN RDTIME=″0″||RDTIME                    RDDATE=STRIPSUBSTRTMPLINE.LINE2POSRDDATELENRDDATE      
    ENDTIME=STRIPSUBSTRTMPLINE.LINE2POSENDTIMELENENDTIME    
    IF LENGTHENDTIME=7 THEN ENDTIME=″0″||ENDTIME                
    ENDDATE=STRIPSUBSTRTMPLINE.LINE2POSENDDATELENENDDATE    
    MAXRC=STRIPSUBSTRTMPLINE.LINE2POSMAXRCLENMAXRC      
    JOBID=STRIPSUBSTRTMPLINE.LINE2POSJOBIDLENJOBID      
    JOBNAME1=STRIPSUBSTRTMPLINE.LINE2POSJOBNAMELENJOBNAME
    /*根据各个列位置以及长度,取出相应的值*/
    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 dayshoursminutesseconds /
    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 lengthrdtime=7then rdtime=″0″||rdtime                             if lengthendtime=7 then endtime=″0″||endtime
    y1=substrrddate32
    y2=substrenddate32
    d1=substrrddate63
    d2=substrenddate63
        h1=substrrdtime12
    h2=substrendtime12
    m1=substrrdtime42
    m2=substrendtime42
    s1=substrrdtime72
    s2=substrendtime72
    baseday1=DATE'B'y1||d1'J'
    baseday2=DATE'B'y2||d2'J'
    days=baseday2-baseday1
    hours=days24+h2-h1
    mins=hours60+m2-m1
    secs=mins60+s2-s1
    mins=secs % 60
    hours=mins % 60
    days=hours% 24
    hour1=hours-24days
    min1=mins -60hour1
    sec1=secs -60mins
    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 'ACCOUNTDEPTBLDG''PROGRAMMER NAME'        
    //CLASS=BMSGCLASS=XMSGLEVEL=11NOTIFY=&SYSUID        
    //RUN EXEC PGM=IKJEFT01DYNAMNBR=30REGION=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 ,现在轮到我们了。大四了!大学的最后一年。在这一年里面,我们要经历很多,又到了一个人生的转折的地方。好多人都想着考研。我们有个同学成绩很好,他说他要去找工作,很多人会吃惊的说一句:“你找工作!”其实我觉得这个没什么好奇怪的,每个人都有自己的想法,自己认为正确的路。只要认认真真地坚持不懈的走下去,一定会达到预期的目的。
    这几天我们在忙劳动,用在比赛的时间可以说很少,接下来的时间我们的事情还很多,要继续将系统完成,完成文档。。。。。。
    总数:130    首页 上一页 下一页 尾页 页次:1/13  转到:
    LOGIN
    FOLLOW ME
    CATEGORIES
    COPYRIGHT
    Creative Commons License
    除特殊声明的页面外,本站作品采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议 进行许可。