문제

내 응용 프로그램의 다른쪽에있는 외부 시스템에 연결 및 등록 된 클라이언트를 대표하기 위해 클래스의 개체를 인스턴스화하는 Java 응용 프로그램을 작성합니다.

각 클라이언트 객체에는 프론트 엔드와 백엔드를 나타내는 두 개의 중첩 클래스가 있습니다. 프론트 엔드 클래스는 실제 클라이언트로부터 지속적으로 데이터를 수신하고 징후와 데이터를 백엔드 클래스로 보냅니다.이 데이터는 프론트 엔드에서 해당 데이터를 가져 와서 적절한 형식과 프로토콜을 사용하여 외부 시스템으로 보냅니다. 그 시스템에는 필요합니다.

디자인에서 우리는 클라이언트 객체의 각 인스턴스화를 스레드로 만들고자합니다. 그런 다음 각 스레드 내에서 각 스레드 내에 자연스럽게 자체 NIO 채널이있는 2 개의 소켓 (편집)이 각각 [/edit], 하나의 클라이언트 측, 하나는 전면 및 백엔드에 상주합니다. 그러나 이것은 이제 차단되지 않은 소켓의 필요성을 소개합니다. 나는 튜토리얼을 읽고 있습니다 여기 이는 메인 스레드에서 선택기를 안전하게 사용하여 모든 스레드를 연결하여 모든 스레드를 처리하는 방법을 설명합니다.

그러나 내가 필요한 것은 여러 선택기입니다. 앞서 언급 한 튜토리얼을 읽음으로써 선택기의 키 세트가 threadSafe가 아니라는 것을 알게되었습니다. 이것은 자체 소켓과 채널 쌍을 제공하려고하면 자체 대표 스레드에 인스턴스화 된 별도의 선택기가 충돌 키를 만들 수 있음을 의미합니까? 선택기를 메인 스레드로 옮기는 것은 약간의 가능성이지만, 내가받은 소프트웨어 요구 사항에 따라 이상적입니다. 도와 주셔서 감사합니다.

도움이 되었습니까?

해결책

여러 선택기를 사용하면 선택기 인스턴스와 동일한 관심사 (OP_READ / OP_WRITE 등)가 동일한 채널을 등록하지 않는 한 괜찮습니다. 여러 selector 인스턴스가있는 동일한 채널을 등록하면 selector1.select ()가 selector2.select ()가 관심을 가질 수있는 이벤트를 소비 할 수있는 문제가 발생할 수 있습니다.

대부분의 플랫폼의 기본 선택기는 poll () [또는 epoll ()] 기반입니다.

selector. 내부 호출을 선택하십시오 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는 Poll () 기반 선택기 -PollSelectorImpl 및 해당 선택기 제공 업체를 PollSelectorProvider로 사용했습니다. 서버는 정상적으로 달렸습니다. Pollset Interface 기반 최적화 선택기 (PollsetSelectorImpl)를 사용한 AIX JDK 1.6 SR5로 이전했을 때 Select () 및 Socketchannel.close ()의 서버에서 자주 교수형을 일으켰습니다. 내가 보는 한 가지 이유는 우리가 응용 프로그램에서 여러 선택기를 열고 (이상적인 선택 스레드 모델과는 달리) 설명 된대로 pollsetselectorimpl의 구현 때문입니다. 여기.

다른 팁

이 단일 소켓 연결을 사용해야하는 경우 데이터 처리 자체에서 채널에서 데이터를 수신하고 작성하는 프로세스를 분리해야합니다. 채널을 위임해서는 안됩니다. 채널은 버스와 같습니다. 버스 (채널을 관리하는 단일 스레드)는 데이터를 읽고 필요한 정보를 포함하여 (스레드-안전) 입력 큐에 작성해야하므로 클라이언트 스레드 (S)는 올바른 데이터 그램 패키지를 선택할 수 있습니다. 대기열. 클라이언트 스레드가 데이터를 작성하는 것을 좋아하는 경우 해당 데이터는 출력 대기열에 기록 된 다음 채널 스레드에서 읽어 채널에 데이터를 작성합니다.

따라서 예측할 수없는 처리 시간 (블록의 주된 이유) 과이 연결을 사용하여 행위자 간의 연결을 공유하는 개념에서 비동기 데이터 읽기, 데이터 처리 및 데이터 작성 개념으로 이동합니다. 따라서 더 이상 예측할 수없는 처리 시간이 아니라 데이터를 읽거나 작성합니다. 비 블로킹은 해당 데이터를 처리하는 데 필요한 시간에도 불구하고 데이터 스트림이 가능한 한 일정하다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top