我正在写一个Java应用程序,将实例化一个类的对象来表示对我的应用程序的另一端连接,并与外部系统注册客户。

每个客户对象在其内具有两个嵌套类,代表前端和后端。前端类将连续地从实际的客户端接收数据,和发送指示和数据传送到后端类,这将需要从前端该数据,并将其在使用适当的格式和协议发送到外部系统该系统需要。

在设计上,我们正在寻找有一个客户对象的每个实例是一个线程。然后,在每个线程内自然会两个插座[编辑]用自己的NIO通道,每个通道[/编辑],一个客户端,一个系统侧驻留在前端和分别后端。然而,现在这引入了非阻塞套接字的需要。我一直在阅读教程这里说明如何安全地使用选择在主线程处理的所有线程使用连接。

不过,我需要的是多个选择 - 每一个都有自己的线程运行。从阅读上述教程中,我了解到,在选择的关键集不是线程安全的。这是否意味着在自己的repsective线程实例化可能会创建冲突的关键,如果我尝试给他们每人自己对插座和渠道是分开的选择器?向上移动选择主线程是一个很小的可能性,但很不理想,根据软件的要求我一直在考虑。感谢您的帮助。

有帮助吗?

解决方案

使用多个选择器就可以了,只要你不注册与相同的利益(OP_READ / OP_WRITE等)同时与选择器的实例相同的信道。登记具有多个选择器的实例相同的信道可能会导致一个问题,即selector1.select()可以消耗的事件selector2.select()可能有意

在大多数平台的默认选择器是轮询()[或epoll的()]基于

Selector.select内部调用int poll( ListPointer, Nfdsmsgs, Timeout) method.

        where the ListPointer structure can then be initialized as follows:

    list.fds[0].fd = file_descriptorA;
    list.fds[0].events = requested_events;
    list.msgs[0].msgid = message_id;
    list.msgs[0].events = requested_events;

这就是说,我建议一个单一选择的线程的使用如在ROX RPC NIO教程提及。 NIO的实现是与平台相关的,而且很可能是在一个平台上是什么在起作用可能没有其他工作。我已经看到了整个次要版本的问题了。 例如,AIX JDK 1.6 SR2使用的民意调查()的选择 - PollSelectorImpl和相应的选择供应商的PollSelectorProvider,我们的服务器运行得很好。当我搬到AIX JDK 1.6 SR5,它使用了pollset接口基于优化的选择(PollSetSelectorImpl),我们遇到频繁挂在我们的服务器在select()和socketchannel.close()。其中一个原因我看到的是,我们在我们的应用程序中打开多个选择(而不是理想选择一个线程模型)和PollSetSelectorImpl实施所描述的此处

其他提示

如果必须使用此单个套接字连接,则必须分离的接收和从和到从数据处理本身的信道写入数据的过程。你不必须委托的通道。的信道是像一个总线。总线(单线程,管理通道)具有读取数据并将其写入到包括所需的信息(线程安全的)输入队列,那么您的客户端线程(S)可以拿起正确的数据包封装队列。如果客户端线程喜欢写数据时,该数据被写入一个输出队列,然后由通道线程读取以将数据写入到该信道。

因此,从使用共享与他们的不可预测的处理时间这方面(其是用于块的主要原因)的行动者之间的连接的概念,则移动到概念的异步数据读出,数据处理和数据写入。所以,这不是处理时间,这是不可预测了,但时候,你的数据被读取或写入。非阻挡装置,该数据流是尽可能恒定,尽管需要什么时间来处理该数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top