2011-01-12 2 views
1

시나리오 : 나는 자바 EE와 약간의 경험을 가지고 있지만자바 EE/글래스 피쉬 - 스레드와 연결

하는 나는 등 스레드 작업, 꽤 많은 시간 동안 자바 SE를 사용하고있다.

제 3 자 Java 라이브러리가 원격 서버 (타사에서)에 연결되어 있습니다. 라이브러리는 여러 스레드를 작성하고 연결 자체를 유지합니다. 라이브러리의 새 인스턴스를 만들어서 새로운 연결을 반복해서 열 수 없습니다. 항상 연결을 유지할 라이브러리의 동일한 인스턴스를 유지해야합니다.

이것은 Java SE 응용 프로그램에서 매우 쉽습니다.

이제 웹 서비스 (GlassFish 또는 유사 제품 사용)를 만들어 내 회사에서 내부적으로이 라이브러리의 기능을 연결에 사용할 수있게하려고합니다. 즉, 요청 인스턴스간에 활성 상태로 유지되도록 사용자 지정 원격 연결 (코드에 의해 생성되거나 관리되지 않음)이 필요합니다.

질문 : 달성이 가능합니까? 그렇다면 어떤 기술을 고려해야합니까?

+0

DB 연결을 의미합니까 ?? –

+0

아니요, 독점적 인 타사 소켓 연결입니다. 나는 JDBC 같은 것을 사용할 수 없다. –

답변

2

당신은 연결 풀을 사용하여 연결할 수 있습니다. 원격 서버에 연결해야 할 때마다 매 시간을 인스턴스화하는 대신이 풀에서 연결을 얻으십시오. 이렇게하면 메모리 풋 프린트 및 효율성을 향상시키는 데 도움이됩니다. 더 이상 사용하지 않으면 연결을 풀로 되돌릴 수 있습니다.

+0

글쎄, 나는 연결을 만드는 사람이 아니다. 독점 라이브러리가 스레드를 만들고 연결을 여는 중입니다. 미안하다면 미안해. –

+1

이 경우 해당 라이브러리의 메소드를 호출 할 수 있지만 라이브러리의 메소드에 대한 호출이 해당 라이브러리 객체에 대한 참조를 얻고 연결이 이미 있는지 여부를 확인하는 것이라고 말하려고하는 singleton.what인지 확인하십시오 그렇다면 동일한 연결을 반환하십시오 (또는 원격 호출이 필요 없습니다). 새 연결을 위해 가십시오. 그런 식으로 라이브러리를 효율적으로 사용할 수 있습니다. 연결 풀링에 대해 여기에서 말하지 않습니다. – UVM

+1

실제로 시도했습니다. 시작하는 것과 비슷하지만 작동하지 않았습니다. 스레드가 계속 실행되었지만 코드에서 오타가 발생하여 작동하지 않게되었습니다. 나는 그것을 발견하고 정적 싱글 톤으로 라이브러리를 유지 실제로 작동합니다! 라이브러리 자체는 스레드로부터 안전하며 초기에 라이브러리를 생성하기위한 팩토리 메소드를 동기화했습니다. 다른 독자들에게 이것은 공유 자원을위한 최적의 솔루션이 아닙니다. 제 경우에는 작동하지만, 예를 들어 여러 개의 응용 프로그램 서버가 있고 그 사이에 데이터를 공유하려는 경우에는 작동하지 않습니다. –

1

저는 최근 Tomcat을 Servlet Container로, Metro 2.0을 JAX-WS 구현으로 사용하여 유사한 시스템을 구현했습니다. 내 서비스는 백엔드 구성 요소 (C++로 구현 됨)에 대한 소켓 연결을 유지하고 독점 네트워크 프로토콜을 사용하여 통신합니다.

구성 요소와의 상위 수준의 통신 (연결 설정, 핸드 셰이 킹 등)을 관리하기 위해 '구성 요소 관리자'스레드를 사용했으며 구성 요소와의 실제 통신을 관리하는 '네트워크 선택자'스레드를 사용했습니다. 이 'Network Selector'는 Java Socket Selector 패밀리 클래스를 사용하는 비동기 비 차단 소켓을 사용합니다. 소켓 선택기 클래스와 상호 작용하기 위해 단일 스레드를 사용하는 것은 여러 스레드가 사용될 때 일부 Java 플랫폼에서 버그를 표시하는 중요한 지점입니다.

지금까지 아주 잘 진행되었으므로 확실하게 말할 수 있습니다. 명확한 설명이 필요하면 여기에 게시하거나 전자 메일로 보내주십시오 (내 프로필 참조).

+0

믿을 수 없을만큼 빠른 대답에 감사드립니다. 그러나, 나는 연결 자체에 대한 통제가 없다. 독점 라이브러리가 스레드를 만들고 연결을 여는 중입니다.사실, 이러한 스레드는 요청 인스턴스간에 계속 실행되는 것 같지만 라이브러리를 직렬화하지 않고 라이브러리 인스턴스에 대한 참조를 어떻게 공유 할 수 있는지 잘 모르겠습니다. –

+0

오 OK - 훨씬 쉽습니다. 아마도 이러한 연결 스레드를 관리하기 위해 '관리자 스레드'가 필요할 수 있습니다. 요점은 요청/응답 워크 플로와 독립적으로 백엔드 리소스를 관리 할 초기화 동안 스레드를 생성해야한다는 것입니다. – trojanfoe

+0

훌륭한 답변을 주셔서 다시 한번 감사드립니다. –

0

JDBC 연결 풀과 같은 방식으로 JNDI를 통해 연결을 유지하는 공장을 가지고 있어야합니다.

그런 다음 연결이 공장으로 반환되었는지 확인한 다음 응용 프로그램 서버 수명주기에 연결을 통합하여 프로그래밍 방식으로 위아래로 당겨 내려야합니다.

주의하지 않으면 불쾌한 클래스 로더 문제가 있습니다. 팩토리와 클라이언트에 공통된 클래스가 있어야하며, 표준 런타임 라이브러리에없는 클래스 인 경우 리플렉션을 사용하여 메서드에 액세스하려는 경우가 아니면 올바르게 공유 할 수있는 방법을 찾아야합니다.

+0

안녕하세요. JNDI를 고정 참조로 유지하는 대신 JNDI와 공유하는 이점은 무엇입니까? 현재, 이것은 잘 작동하는 것 같습니다. Context가 ServletContextListener를 통해 초기화/파괴 될 때 연결을 생성/삭제하라는 제 3 자 팩토리를 말하고 있습니다. –

+0

코드가 실행되는 것과 동일한 클래스 로더에 풀이 존재할 것으로 기대되는지 여부에 따라 다릅니다. 분명히 작동합니다 :) –