我们在Java中有一个Web应用程序,它调用进度过程。 Progress 4gl版本是10.x并且在AIX上。
要求是实现以下功能: 假设Web应用程序调用了进程过程。这使得appserver事务可以运行。在处理事务时,如果用户关闭浏览器窗口,则需要识别appserver进程,并且应该使用其进程ID来终止该进程。可以通过调用shell脚本来实现对进程的杀死。 如何识别即将关闭的Web应用程序会话的appserver进程ID?
答案 0 :(得分:0)
如果appserver进程花费的时间足够长,这是一个问题,那么你做错了什么 - 通常对应用程序服务器的往返调用应该是如此之短,以至于在此期间关闭浏览器将不会出现问题。无所谓。
其次,如果您正在运行无状态,则无法知道哪个appserver座席正在运行呼叫,因为最后一个呼叫可能已被路由到多个座席中的任何一个,并且没有握手回到呼叫者那是哪一个。
因此,做你正在寻找的唯一合理的方法是
答案 1 :(得分:0)
所以真正的问题是你有长时间运行的任务,用户放弃并重新出于急躁(可能是由于缺乏对任务进度的反馈)?
您尚未提供有关“Java中的Web应用程序”的任何详细信息,因此我不知道您在做什么或者它与Progress app服务器会话的关系。
为了让Web应用程序终止远程运行的进程,需要对该远程进程进行某种引用。听起来你正在同步调用远程进程并等待响应。您需要做的第一件事是异步调用远程进程(Progress确实支持异步app服务器调用。这可能是一个起点。但这取决于“Java中的Web应用程序”的含义。)
如果您可以以某种方式异步调用该进程,那么您应该在启动它时获取PID(或可用于对进程进行外部反射的一些其他唯一标识符)。然后,当您弹出确认警告框以正确提供“kill”命令时,可以使用它。
如果您无法弄清楚如何进行异步应用程序服务器调用,那么使用同步调用模拟此类事物的粗略方法是通过db表来编组请求(和响应):
插入描述请求的记录,提供所有必要的参数和上下文,以独立启动请求,然后将请求ID返回给调用者。
然后呼叫者循环 - 暂停一段时间并检查请求的状态。这应该是一个非常简单的调用,它只是从数据库读取请求记录以提取其状态。
在远程端,一个或多个批处理进程正在循环读取请求表以查找新记录。当他们找到一个时,他们启动一个执行请求的过程。你可以在这里看到各种各样的控件和负载平衡的东西,或者你可以保持简单和轻松。
执行请求的进程会根据需要更新状态记录,以便Web浏览器客户端可以查看正在进行的操作。 (步骤#2)
请求完成后,结果将反馈给客户端 - 可能通过db表或者作为新页面。这取决于应用程序。基本的想法是,当步骤#2注意到状态是“完整”时,它会做任何适合于结果的事情。
如果客户端决定终止请求,它应该在步骤#1中收到足够的信息以将该引用传递给服务器,以便服务器可以对其执行操作。通常,您希望将请求记录的状态更新为“已杀死”(或其他),然后允许子进程注意到并终止自身或使用操作系统级工具执行实际的“杀死”。
顺便说一句 - 如果您正确地组织了“上下文和参数”部分,您可能能够识别并消除重复请求或至少缓存答案。
答案 2 :(得分:0)
汤姆和蒂姆都有两个很好的答案。我想你需要重新思考你的架构。
但这并没有回答关于获得PID的问题。假设您运行某种与Progress AppServer的连接,该AppServer正在运行.p程序,您可以在该程序中执行以下操作:
FIND FIRST _MyConnection NO-LOCK.
/* You might not want to DISPLAY but rather do something else: */
DISPLAY _MyConnection._MyConn-Pid.
您也可以在操作系统中执行此操作。假设您已经运行了proenv脚本,那么您可以设置环境:
wtbman -name asXXX -query
(将asXXX替换为appserver的名称 - 默认为asbroker1)。
输出是这样的:
OpenEdge Release 11.3.1 as of Fri Sep 13 19:00:23 EDT 2013
Connecting to Progress AdminServer using rmi://localhost:xxxx/Chimera (8280)
Searching for asXXX (8288)
Connecting to asXXX (8276)
Incorrect utility to use for asXXX (15827)
Broker Name : asXXX
Operating Mode : State-reset
Broker Status : ACTIVE
Broker Port : YYYY
Broker PID : ZZZZ
Active Servers : 2
Busy Servers : 0
Locked Servers : 0
Available Servers : 2
Active Clients (now, peak) : (0, 2)
Client Queue Depth (cur, max) : (0, 2)
Total Requests : 26322
Rq Wait (max, avg) : (18079 ms, 25 ms)
Rq Duration (max, avg) : (18079 ms, 25 ms)
PID State Port nRq nRcvd nSent Started Last Change
16319 AVAILABLE ZZZZZ 001447 001447 001447 Aug 8, 2014 11:50 Aug 14, 2014 13:20
16320 BUSY ZZZZZ 001385 001385 001385 Aug 8, 2014 11:50 Aug 14, 2014 13:10
查看pids列表。 16319是可用的,16320是忙碌的并且已经持续了10分钟(如果现在时间是13:20)。这告诉我们PID 16320很可能是悬挂程序。
现在你可以做到:
asbman -name asxxx -agentdetail 16320
这将为您提供更多信息,如PROPATH,堆栈跟踪和连接的数据库。在寻找问题时非常有帮助。