免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5245 | 回复: 17

关于UPDSRVPGM后立即生效的问题 [复制链接]

论坛徽章:
0
发表于 2011-11-18 11:37 |显示全部楼层
本帖最后由 niuhua77 于 2011-11-18 11:45 编辑

问题: 做过ILE 模式开发的同学都有过这样的经历:
已经执行过的service program,重新编译了一个module后,并且更新了相应的service program (UPDSRVPGM),然后再次调用这个service program下的这个module,但是结果显示module并没有更新,举个例子:
clip_image002.jpg

整个程序的组织结构关系,我描述的还清楚吧,现在执行:
= =>CALL  PGM(PGMA),则会在屏幕上显示:AAA。
下面把MOD1的功能改成dSPLY  BBB,即:
clip_image003.jpg

然后重新编译MOD1、更新SRV0,重新执行CALL PGM(PGMA)
得出的结果仍然是:AAA
刚才明明重新创建了MOD1,并且也进行了UPDSRVPGM,应该打印的是BBB,为什么还是AAA呢?如何才能让程序调用最新的Module呢?
解决办法:
1 最简单粗暴直接的办法就是sign off ,再重新登陆。
2 用命令RCLACTGRP  ACTGRP(QILE)

下面是我对此的理解(正确性有待验证):
当更新一个PGM(module)时,旧的程序版本会被系统移到QRPLOBJ这个library中。如果在更新PGM(module)时,PGM(module)恰好处于活动的状态,那么系统会自动让用户继续使用QRPLOBJ中的旧版本程序,而不会报错,当然用户也无法使用新版本的程序。
当再次加载此程序的时候,才会使用新版本的程序。      那什么时候会再次加载程序?
对于service program而言:
1  program运行时系统会检查其activation group是否创建,若没有创建,则会创建activation group。然后系统会在activation group中检查相关的service program是否已经被激活,如果service program尚未被激活,则系统会激活service program;如果service program已经被激活,就不会再次进行激活。简单的说service program 只有在PGM首次运行的时候,才会被激活,并且此后这个service program一直处于活动状态,直到activation group被删除。(RED BOOK)

2 这段完全是我个人的猜想,没找到相关的理论做支撑。
当更新service program时,因为service program在第一次被调用的时候,已经被激活了,所以仅仅更新了ASP(硬盘)中的service program,而没有更新activation group中的service program。这时候最直接的想法就是让activation group重新加载service program,这样就可以把ASP中新版本的service program重新加载到activation group中了。但是系统并没有现成的命令,可以删除activation group中的service program再进行重新加载,所以我们要用SIGN OFF和RCLACTGRP来先删除activation group,这样activation group中的所有资源就都被释放掉了。然后PGM A再次运行的时候系统自动又会创建activation group,然后会重新加载service program,这样就会使用到新版本的service program了。

下图为我设想的简易流程图
clip_image0034.jpg

以上有一部分内容没有找到论据,正确性有待验证,欢迎讨论批评指正

论坛徽章:
0
发表于 2011-11-18 11:46 |显示全部楼层
对于自己的猜想,没什么信心,谁知道到底怎么回事,给我解释一下吧

论坛徽章:
0
发表于 2011-11-18 15:57 |显示全部楼层
你程序结束前里有释放资源的命令吗?你可以自己尝试下来论证自己的想法,signon之后别调用原来的module, 直接改module,updsrvpgm,然后调用,看是用的是改之后的还是改之前的

论坛徽章:
0
发表于 2011-11-18 16:00 |显示全部楼层
学习了

论坛徽章:
0
发表于 2011-11-18 16:28 |显示全部楼层
回复 3# banym1982


程序第一次执行完后没有释放资源,这就是问题的所在。

sign on后直接修改module,然后updsrvpmg,然后call 程序,这样会执行更新后的module。

因为只有在service program处于active状态的时候,你去更新service program才会出现不会立即生效的问题。

因为刚登陆系统,service program还没有被激活,不存在replace while program active这种情况,所以module马上就会被更新到。

论坛徽章:
0
发表于 2011-11-18 16:28 |显示全部楼层
回复 4# xjromance


    一起讨论吧

论坛徽章:
0
发表于 2011-11-18 16:46 |显示全部楼层
本帖最后由 niuhua77 于 2011-11-18 16:47 编辑

我再说说我的疑惑,IBM red book上说:If there are active users of the program when you replace it,

the active users continue to operate from the version in QRPLOBJ without reallyknowing it.

我对这句话的理解是,如果replace一个处于active状态的program,那么user实际上使用的是library:QRPLOBJ中的旧版本的program。

对这句话,有2个单词需要好好理解:

1 active ——什么样的program是active?  call stack中正在使用的program 肯定是active的。还有一部分service program暂时没有被使用,但是已经被激活了,也应该算是active的。

2 user —— 这里的user跟我们的user profile 应该不是一个概念。举个例子,假如PGMA 调用PGMB,那么PGMA就是PGMB的user。在一个job中,PGMB可以对应多个user,因为PGM1

PGM2 PGM3都有可能调用PGMB。

我的理解对么?

论坛徽章:
0
发表于 2011-11-18 21:06 |显示全部楼层
加精华。。。。andy厉害啊

论坛徽章:
0
发表于 2011-11-19 13:12 |显示全部楼层
回复 8# ping222s


    呵呵,谢谢,不敢妄称厉害。

    有一部分只是我个人的想法,没有找到理论依据,不敢说正确。

    贴出来想找人讨论一下。

论坛徽章:
0
发表于 2011-11-20 17:45 |显示全部楼层
问题: 做过ILE 模式开发的同学都有过这样的经历:
已经执行过的service program,重新编译了一个module后 ...
niuhua77 发表于 2011-11-18 11:37



    Andy,你思维有问题。这不是技术交流的方式,前提都不存在了,还津津探讨问题。

   在公开场合,特别这里是400论坛,这样的交流技术方式,会误导他人。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP