如何控制在多个端口上侦听的java服务器应用程序

时间:2011-12-23 19:53:25

标签: java multithreading

首先,如果已经回答,请原谅我。我花了几个小时在互联网上搜索(包括stackoverflow)我的答案/好的提示,但我发现的并不是我想要的东西,所以我决定发帖......这里去了。

我正在编写一个程序,通过单个(Windows)计算机上的套接字接收“feed”。我将有6个输入,所以我正在收听6个端口(7000-7005)。每个“提要”都是我想要读取/解析并写入数据库的某些数据。每个套接字上的数据将每15秒发送给我一次(例如,数据每15秒刷新一次)。

我编写了一个简单的java程序(建模为服务器程序),它只是监听指定的端口,接收更新并将它们写入数据库。我们一般称之为“听众”程序。

我可以在命令行更改端口,所以我在这个早期阶段所做的就是打开6个命令提示,然后运行java -jar myprogram.jar,我看到了我期望看到的内容。我对这个设置的理解是我有6个JVM在运行(基本上是6个独立的进程)。

我的问题围绕控制每个听众。我想为监听器创建一个管理界面......我希望能够从CENTRAL脚本/程序控制每个监听器/端口组合的启动/停止。

之前我曾经使用过Threads并且想过修改我现有的应用程序来启动并创建6个线程来处理每个端口的监听。然后,我可以从主程序调用命令来通过端口号或某个名称来控制子线程。

我对这个设计的想法/关注是,如果我获得了任何一个更新已经发生了一些重大变化的更新,那么它的线程有“执行焦点”?线程通常是时间切片的吗?如何确保这些子线程始终准备好获取更新?我知道CPU切换速度很快:-)但是有些(虽然很小)可能因为我认为时间切片而错过了更新?

然后我想保持原样并且只运行程序的多个实例,其中每个实例绑定到特定端口。好的..如果我这样做,我如何从一个地方控制所有实例?我已经阅读了一些关于RMI的内容..答案是什么?所以我可以从控制程序中调用“远程”方法来对抗服务器应用程序的其他实例。

我正在寻找这个问题场景的一些提示/最佳实践。希望我已经解释了问题的明确性。感谢您阅读并发布任何想法/链接等。

2 个答案:

答案 0 :(得分:1)

你的时间是什么意思? TCP的重点是验证数据。即使进程/线程没有响应,数据也不会丢失。内核将保持不变,直到连接超时。

我建议只需启动线程监听不同的端口,并回调主处理程序(启动线程),然后在那里处理消息。

您不需要多个流程。

答案 1 :(得分:0)

您的方案绝对没有问题。等待I / O操作的线程(如从文件,套接字读取,等待阻塞锁等)会自动阻止调度,并在检测到输入之前进入休眠状态。然后,操作系统唤醒休眠线程,以便他们可以读取来自套接字的输入。