2010-07-23 74 views
1

所以我正在解决一些问题,一些建议会很好。先有一点背景,请原谅。如何处理具有多个输入和输出的单个文本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个),但是这也会使得分析哪些地方变得复杂。

任何意见的方向将不胜感激。

回答

1

看看每个EMS使用一个进程,以便与每个EMS的通信是分开的。这至少会确保与其他ems的通信不受这个问题的影响。

您将不得不建立某种命令排队系统,以便发送到Hitachi ems的命令在完成之前不会阻止用户界面。要么是这样,要么你必须在开始使用它之前将10分钟的延迟放入客户端软件,或者在处理日立的接口部分延迟10分钟。

也许这将是一个很好的策略来调出连接,并立即发送某种ping或站点保持空闲命令 - 这是一种良性的做法,你不关心响应,或者没有响应,但会触发10分钟延迟结束。您的用户可以熟悉这10分钟的延迟,并且至少在获得咖啡之前启动应用程序。

如果您可以在应用程序设计中以某种方式将日立与其他ems进行隔离,那么这将确保10分钟延迟仅在与日立接口时才存在。您可以连接并发布虚拟命令,并将Hitachi置于某种“连接”状态,在该状态下命令无法使用,直到结果进入,然后将状态更改为就绪状态,以便用户与其进行交互。


另一种方法是开发某种中间件组件 - 我不知道你是否已经这样做了。如果客户端都是基于网络的,那么你可以在网络服务器上运行一个通信件,该服务器从客户端获取连接,并通过与所有ems通信的网络服务器上的一块管道连接它们。当这件作品在网络服务器上启动时,它可以连接到每个EMS并发送一些启动10分钟定时器的初始ping命令。完成此操作后,Web服务器上的部分可以每隔一段时间发送一次保持活动消息,再次使用某种虚拟命令,以保持套接字的活跃状态,以便不必重新设置并再次等待10分钟的等待时间。当用户打开网站时,他们可以与这个中间件服务器通信,将这些请求转发给适当的ems,并将响应转发回客户端 - 全部通过已经打开的连接。

+0

回答一些要点。该应用程序在Tomcat下运行,因此只有当我重新启动Tomcat时才会注意到延迟。已经有一种TL1命令作为一种类型 - “rtrv-hdr”命令的ping命令。 – Bill 2010-07-23 20:27:30

+0

那么您是否正在寻找如何实际开发处理接受命令的队列结构,通过套接字发送它们,检索结果并将它们发送回适当的客户端? – 2010-07-23 20:30:22

相关问题