2011-09-28 6 views
1

XMPP를 통해 메시지를 전송하라는 요청을받는 웹 서비스를 작성하고 있습니다. 그러나 모든 메시지가 하나의 계정에서 전송됩니다 (서버가 로그인하여 사용자에게 알림을 보냅니다).하나의 XMPPConnection 만 생성되도록하는 방법은 무엇입니까? 싱글 톤을 사용 하시겠습니까?

여기에 문제가 있습니다 - 어떻게 구현합니까? 내가 here, 을 읽은 것처럼 나는 싱글로 XMPPConnection를 구현하려고했지만, 나는 호스트 이름, 포트를 포함하는 생성자에 인수 전달에 붙어있어, JID는 매개 변수 싱글은 싱글

없는 등 ... 따라서 다음과 같이 해결할 생각입니다. (어떤 종류의 공장입니까?) :

public class XMPPConnectionSingleton 
{ 
    private volatile static XMPPConnectionSingleton anInstance; 
    private volatile static XMPPConnection connection; 

    public static XMPPConnectionSingleton getInstance() { 
     if(anInstance == null) { 
      synchronized (XMPPConnectionSingleton.class) { 
       if(anInstance == null) 
        anInstance = new XMPPConnectionSingleton(); 
      } 
     } 
     return anInstance; 
    } 

    public void init(String server, int port, String jid, String password, String resource) 
    { 
     ConnectionConfiguration conf = new ConnectionConfiguration(server, port); 
     connection = new XMPPConnection(conf); 
     // logging in, etc. 
    } 
} 

좋은 방법입니까? 아니면 매개 변수없이 생성자를 수락하여 XMPPConnection의 래핑 클래스를 만드는 것이 더 낫습니다.

+0

중요한 문제는 웹 서비스가 작동하는 방식입니다. 여러 통화가 동시에 이루어지기를 기대합니까? 그렇다면 XMPP 서버가 동시에 여러 연결된 클라이언트를 허용합니까? – ThomasRS

+0

크기가 다른 환경에서 웹 서비스가 사용되므로 동시 호출이 발생할 수 있습니다. 동시에 여러 고객이 연결된다는 것은 무엇을 의미합니까? XMPP 서버는 WS 서버에서 단 하나의 연결 만 받아 들여야합니다. –

+0

그래, 다른 질문 [여기] (http://stackoverflow.com/search?q=XMPP+multiple+clients+)에 따르면, 동시에 여러 클라이언트처럼 보일 수도 있습니다. 너무 많은 오버 헤드가 없다면, 그렇게 생각할 수 있습니다. – ThomasRS

답변

0

~ 싱글 톤을 사용할 수 있습니다. question 및 관련 페이지 herehere을 읽어보십시오. 가장 정적 인 것은 정적 블록에서 초기화하는 것이지만, 이는 항상 까다롭게 수행 할 수있는 것은 아닙니다.

단순한 방법은 단일 인스턴스에서 동기화하고 모든 WS 호출은 대기합니다. 이 기능은 용량이 적을 때 유용합니다. ReentrantLock을 사용하면 로직을 다소 향상시킬 수 있습니다 - 예를 들어 전체 HTTP 호출을 보내는 것보다 시간 초과 WS 응답을 보내는 것.

많은 동시 세션이 필요한 경우 서버가 여러 클라이언트로 로그인 한 다음 원하는만큼 클라이언트를 초기화 할 수 있는지 확인한 다음 ReentrantLock을 사용하여 현재 사용 가능한 클라이언트를 확인하십시오.

WS 호출의 논리 (메시지가 XMPP로 전송된다는 확인이 필요합니까?)에 따라 실제 호출을 보내기 전에 호출을 대기열에 넣고 다른 스레드에서 서비스하는 것을 고려할 수 있습니다. http 보류 시간은 일반적으로 30 초이지만 변경할 수 있습니다).

각 WS 세션이 통화 기간 동안 연결되어 자체 세션을 가질 수도 있습니다.

편집 : 나는 당신이

// Correct lazy initialization in Java 
@ThreadSafe 
class Foo { 
    private static class HelperHolder { 
     public static Helper helper = new Helper(); 
    } 

    public static Helper getHelper() { 
     return HelperHolder.helper; 
    } 
} 
도우미

  1. 곳에서 로그인 정보를 가져 헬퍼 클래스의 XMPP 클라이언트 클래스를 래핑입니다

    , 또는

  2. 갈 제안
  3. 하드 코딩 된 로그인 정보가있는 XMPP 클라이언트 클래스 자체.

그러면 반환 된 객체에 synchronized 연산자를 사용하기 만하면됩니다.

+0

불행히도, 어떻게 동기화를 사용하고 싶지는 않습니다. 좀 더 명확히 해 주시겠습니까? 내가 가진 주요 문제는 싱글 톤을 만드는 방법이 아니라 매개 변수를 사용하여 생성 될 수있는 의사 싱글 톤을 만드는 방법입니다. 또는 모든 WS 호출간에 XMPPConnection 개체의 한 인스턴스를 전달하는 데 사용할 수있는 솔루션이 있습니다. 많은 동시 세션에 관해서 말하면 - 메시지를 보내기 위해 모든 WS 요청에서 공유되는 1 개의 연결 개체를 만들고 싶습니다. WS는 "성공"/ "실패"를 클라이언트에게 반환해야합니다. –

+0

편집을 참조하십시오. XMPP 클라이언트 자체가 스레드로부터 안전하다는 말입니까? – ThomasRS

+0

1) 이제 귀하의 아이디어를 얻었습니다. 그러나 로그인 정보를 래핑 클래스에 가져 오는 방법은 무엇입니까? 내가 볼 수있는 유일한 방법은 init()을 작성한 후 아직 초기화하지 않았는지 확인한 후 확인하는 것입니다. 그것은 나의 해결책과 매우 비슷한 것으로 보인다. 그렇지 않은가? 나는 초보자이다. 어쩌면 주목할만한 몇 가지 큰 차이점이있을 수있다. :) 2) 글쎄, XMPP 클라이언트가 thread-safe한지 고려하지 않았지만, http://community.igniterealtime.org/thread/19605). –

0

내게는 잘못된 접근 방식이 좋습니다. 왜 단순히 WS 요청을 대기열에 넣고 단일 스레드가 요청을 읽고 xmpp를 통해 메시지를 쓰게하지 않을까요? 단일 연결 만있을 수 있지만, 사용자 정의 코드를 작성하여 단일 연결을 작성하지 않아도됩니다.

+0

메시지를 보내는 것이 성공하면 큐에 모든 것을 넣는 것이 피드백을 필요로합니다. 운수 나쁘게. –

+0

아니요, FutureTask와 같은 결과를 차단하고 반환하는 메커니즘을 사용해야합니다. 요점은 단순히 단일 연결을 공유하는 것입니다. – Robin

관련 문제