java - 如何处理具有多个输入和输出的单个文本 io 流?

标签 java spring iostream

所以我正在解决一些问题,一些建议会很好。首先介绍一点背景,篇幅请见谅。

我正在开发一个管理系统,该系统通过 TL1 protocol 查询网络设备。对于那些不熟悉该协议(protocol)的人来说,简短的回答是,它是一种“人类可读”语言,通过基于文本的 IO 流进行通信。

我正在使用 Spring 和 Jsch 打开远程 NE(网络元素)的端口,登录,运行命令,然后关闭连接。有两种方法可以进入远程 NE,或者直接(通过 ssh 网关)如果该元素具有 TCP/IP 地址(许多只是 osi),或者通过某种类型的 ems(管理系统)使用所谓的“北向接口(interface)”。

无论哪种方式,过程都是相同的。

  • 使用 Jsch 打开到 NE 或 ems 的端口。
  • 发送NE ex的登录命令。 "act-user<tid>:<username>:UniqueId::<password>;"
  • 发送命令例如。 "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\","

    ;

;很重要,因为它标志着响应的结束。

  • 最后注销,并关闭端口。

在 Spring 中,我一直使用 ThreadPoolTaskExecutor非常有效地做到这一点。

直到这个问题出现......

对于一个特定的 ems 平台(日立),我的方法遇到了障碍。该 ems 通过它处理多达 80 个节点。您连接到端口,然后发出命令登录 ems,然后运行指向各个 NE 的命令。与之前的过程相同,但问题是......

登录 ems 后,下一个命令,无论是什么,最多需要 10 分钟才能完成。在此之前,所有其他命令都将被阻止。在最初的等待之后,所有其他命令都会快速运行。似乎没有办法阻止这种行为(我怀疑在此期间发生了一些 NE 自动发现)。

现在我的问题的主旨......

因此,我对该平台的下一个方法是连接到 ems,登录到它,并保持连接打开,然后将命令传递到各个 NE。这意味着应用程序(基于 Web)首次加载后会有 10 分钟的延迟,但在此之后就可以了。

我遇到的问题是如何最好地做到这一点。有一个基于文本的 iostream 来传递这些东西看起来像一个大瓶颈,再加上多个用户将使用该应用程序,我如何针对这个单个 iostream 处理多个命令和响应?我可以在这个 ems 上打开一些 iostream(可能最多 6 个),但这也使整理哪些内容去哪里变得复杂。

任何有关方向的建议将不胜感激。

最佳答案

考虑对每个 em 使用一个进程,以便将与每个 em 的通信分开。这至少可以确保与其他ems的通信不会受到这个ems问题的影响。

您将必须构建某种命令排队系统,以便发送到 Hitachi ems 的命令在完成之前不会阻塞用户界面。要么这样,要么您必须在客户端软件中延迟 10 分钟才能开始使用它,或者在处理 Hitachi 的界面部分中延迟 10 分钟。

也许建立连接并立即发送某种 ping 或站保持空闲命令是一个很好的策略 - 一些良性的命令,您不关心响应,或者不给出响应,但会触发 10 分钟的延迟来结束它。您的用户可以熟悉这 10 分钟的延迟,并且至少在喝咖啡或其他东西之前启动应用程序。

如果您能够以某种方式将 Hitachi 与应用程序设计中的其他 ems 隔离,这将真正确保仅在与 Hitachi 交互时才存在 10 分钟的延迟。您可以连接并发出虚拟命令,并将 Hitachi 置于某种“连接”状态,在结果出现之前无法使用命令,然后将状态更改为就绪,以便用户可以与其交互。

<小时/>

另一种方法是开发某种中间件组件 - 我不知道您是否已经这样做了。如果客户端都是基于网络的,那么您可以在网络服务器上运行一个通信部分,该通信部分从客户端获取连接,并将它们通过网络服务器上的一个部分进行管道传输,该网络服务器与所有 ems 进行通信。当这个部件在网络服务器上启动时,它可以连接到每个 ems 并发送一些初始 ping 命令,该命令启动 10 分钟计时器。一旦完成,网络服务器上的部分就可以经常发送保活消息,同样是某种虚拟命令,以保持套接字处于 Activity 状态,这样它就不必重置并再次经历 10 分钟的等待时间。当用户打开网站时,他们可以与这个中间件服务器进行通信,该中间件服务器会将请求转发到适当的 em,并将响应转发回客户端——所有这些都是通过已经打开的连接进行的。

关于java - 如何处理具有多个输入和输出的单个文本 io 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321944/

相关文章:

java - Hibernate 中 select Double 的问题

java - Swing - JTable 单元格以不同颜色突出显示

java - 使用itext生成pdf后直接下载到浏览器

java - 如何在weblogic上部署spring boot应用程序?

c++ - 从空缓冲区构造 `std::ostream` 是否有效?

c++ - Fstream 不保存文件中的最后一个单词,也不从文件中读取

Java PreparedStatement UTF-8字符问题

java - 如何在 Spring Tools Suite 上添加 Spring roo

c++ - 流 cout 设置标志 std::ios_base::skipws 有什么原因吗?

java - 在java中运行shell命令,提示输入用户名密码