2016-06-23 2 views
0

원격 메소드를 호출하기 전에 클라이언트 측에서 시간 제한을 설정할 수 있도록 RMI 연결 팩토리를 사용하는 응용 프로그램을 작성 중입니다. 클라이언트가 미리 정해진 시간 동안 원격 메서드에 대한 호출을 기다리고 나서 호출을 포기하고 포기할 수 있도록이 작업을 수행하려고합니다.RMI 스텁에서 소켓 팩토리를 가져올 수없는 것 같습니다. 왜 그래야만하지?

이 메커니즘을 용이하게하는 소켓 팩터 리를 만들었습니다. UnicastRemoteObject.exportObject(Remote, int, RMIServerSocketFactory, RMIClientSocetFactory)으로 리모트 스텁을 작성하여 클라이언트가 두 디바이스 모두에 알려진 클래스 정의 인 사용자 정의 된 소켓 팩토리와 함께 스텁을 사용할 수있게합니다.

클라이언트의 소켓 팩토리가 서버를 호출하기 전에 제한 시간을 설정해야합니다. 클라이언트는이 시간 제한의 길이를 결정합니다. 이 방법으로 작동하는 소켓 팩터를 만들 수 있습니다. 그러나 원격 스텁이이 사용자 지정된 소켓 팩토리를 가지고 있다는 것을 클라이언트에서 보장 할 수 없어서 클라이언트 소켓 팩토리가 제한 시간을 가진 클라이언트 소켓을 만들 수 있는지 확인할 수 없습니다.

나는 Remote.getClientFactory()이 작동해야한다고 생각하는 방식으로 작동하는 방법이 있는지 궁금합니다. 이것은 내가 RMI 스펙에서 다루지 않는 분명한 특징으로 보인다. 이 메소드가 없다면 클라이언트에서 클라이언트의 소켓 팩토리를 검색하기 위해 잘 사용되는 '해킹'이있을 수 있으므로 타임 아웃을 지정할 수 있습니까?

답변

0
  1. 당신이 필요로하는 공장하지만 전화를 걸 사용하는 것입니다 실제의 소켓이 아닌, 그 때문에 클라이언트에 예측 가능한 아니다대로, 심지어 수 있다면 당신은 더 좋은 일을하지 않을

    - 사이드 연결 풀링.

  2. 각 호출 전에 sun.rmi.transport.tcp.responseTimeout을 조정 해 볼 수는 있지만 JVM의 수명 기간 동안에는 단 한 번 읽는 것이 좋지 않습니다.

  3. 그렇지 않은 경우 원격 객체마다 다른 소켓 팩토리를 사용할 수 있으며 원격 인터페이스마다 다른 원격 객체와 원격 메소드마다 다른 원격 인터페이스를 사용할 수 있으므로 각 소켓 팩토리는 고유 한 원격 메소드와 고유하게 연결됩니다. 필요에 따라 소켓 읽기 타임 아웃을 각 팩토리에 할당합니다.하지만 여전히 서버 측입니다. 연결 풀링으로 인해 혼란을 겪습니다.

  4. 또는 당신이 원하는 경우 비공식 후드 아래 수도가 아니라 업무와 다음 릴리스 비 호환 don't use sun.* classes 장난 꾸러기 버전 :

    RemoteRef remoteRef; 
    if (stub instanceof RemoteStub) 
    { 
        remoteRef = ((RemoteStub)stub).getRef(); 
    } 
    else 
    { 
        // dynamic proxy 
        RemoteObjectInvocationHandler roih = (RemoteObjectInvocationHandler)java.lang.reflect.Proxy.getInvocationHandler(stub); 
        remoteRef = roih.getRef(); 
    } 
    if (remoteRef instanceof sun.rmi.server.UnicastRef2) 
    { 
        // JRMP stub with client socket factory. 
        // NB UnicastRef.getLiveRef() was added somewhere between 1.3 and 1.6. 
        // Previously it was only obtainable via reflection. 
        RMIClientSocketFactory csf = ((sun.rmi.server.UnicastRef2)remoteRef).getLiveRef().getClientSocketFactory(); 
        // YOUR CODE GOES HERE 
        // Note that 'csf' can still be null here, if you exported the remote object with an *explicitly null* client socket factory parameter. 
    } 
    

    그러나 나는에서 시작주의 할주의 (1) . 이것은 당신에게 전혀 도움이되지 않을 수도 있습니다.

+0

EJP. 나는 옵션 4에 강한 경향이있다. 나는이 옵션을 사용하는 무언가를 만들 것 같고, 업데이트 된 RMI 스펙이 장난 꾸러기다고 말할 때까지 기다릴 것이다. –

+0

'sun.rmi. *'클래스를 사용하는 것은 이미 엉터리입니다. RMI에서 변경 사항이있을 때까지 기다리지 않아도됩니다. 012에서 2004 년에 1.5가 나온 이래로 아무 일도 일어나지 않았습니다. – EJP

+0

흠 ...'RemoteStub'는 더 이상 사용되지 않습니다 ... 나는 진정한 경우의 내용이 이전 버전과의 호환성을 위해 있다고 가정합니다 ... 나는 이것을 통합하지 않았습니다. 논리를 내 솔루션으로 나는 최신 자바로 내 일을 처리하는 것에 관심이있다. –

관련 문제