所以我正在解决一些问题,一些建议会很好。先有一点背景,请原谅。如何处理具有多个输入和输出的单个文本io流?
我正在通过TL1 protocol查询网络设备的管理系统。对于那些不熟悉协议的人来说,最简单的答案就是通过基于文本的IO流进行通信的“人类可读”语言。
我使用Spring和Jsch打开一个端口到远程网元(网元),登录,运行命令,然后关闭连接。有两种进入远程网元的方式,直接(通过ssh网关)如果元素有一个tcp/ip地址(许多只是osi),或者通过某种类型的ems(管理系统)使用所谓的“北向接口”。
无论哪种方式,程序是相同的。
- 使用Jsch打开一个端口到NE或ems。
- 发送网元前的登录命令
"act-user<tid>:<username>:UniqueId::<password>;"
- 发送命令ex。
"rtrv-alm-all:<tid>:ALL:uniqueid::,,,,;"
检索并处理结果。上述例如可能是这个样子的结果...
RTRV-ALM-ALL:foo:ALL:uniqueid;
CMPSW205 02-01-11 18:33:05
M uniqueid COMPLD
"01-01-06:MJ,BOARDOUT-ALM,SA,01-10,12-53-58,,:\"OPA_C__LRX:BOARD EXTRACTED\","
;
;
很重要,因为它表示响应的结束。
- 最后注销并关闭端口。
随着春天我一直在使用ThreadPoolTaskExecutor
相当有效地做到这一点。
直到这个问题上来......
与一个特定的EMS平台(日立),我碰到一个障碍跑了我的做法。这个EMS通过它可以处理多达80个节点。您连接到端口,然后发出命令登录到ems,然后运行指向各个NE的命令。与以前相同的过程,但这里是问题...
在您登录到ems后,无论是什么,下一个命令将花费10分钟完成。直到发生这种情况,所有其他命令都被阻止。在初始等待之后,所有其他命令都可以快速工作似乎没有办法打败这种行为(我怀疑在此期间有一些NE自动发现发生)。
现在我的问题的重点......
因此,我对这个平台的下一个方法是连接到ems,登录到它,并保持连接打开,并将命令传递给各个NE。这意味着应用程序(基于Web)第一次加载后延迟10分钟,但在此之后会很好。
我遇到的问题是如何最好地做到这一点。使用单个基于文本的iostream传递这些东西看起来像是一个很大的瓶颈,再加上多个用户将使用该应用程序,我该如何处理针对这个单一iostream的多个命令和响应?我可以在这个ems上打开几个iostreams(也许最多6个),但是这也会使得分析哪些地方变得复杂。
任何意见的方向将不胜感激。
回答一些要点。该应用程序在Tomcat下运行,因此只有当我重新启动Tomcat时才会注意到延迟。已经有一种TL1命令作为一种类型 - “rtrv-hdr”命令的ping命令。 – Bill 2010-07-23 20:27:30
那么您是否正在寻找如何实际开发处理接受命令的队列结构,通过套接字发送它们,检索结果并将它们发送回适当的客户端? – 2010-07-23 20:30:22