2016-07-11 3 views
0

Apache Qpid Proton client library을 사용하여 특정 max_frame_size으로 AMQP 1.0 연결을 열고 싶습니다. 이것은 실제 응용 프로그램이 아닌 테스트 스위트 내에 있습니다.Qpid Proton AMQP 1.0 클라이언트 라이브러리에서 연결의`max_frame_size` 설정하기

Java 라이브러리는 C 라이브러리 및 다른 언어에 대한 다양한 바인딩보다 고급 버전 인 것 같습니다. 따라서 Java 버전을 사용하기 시작했습니다. 안타깝게도이 매개 변수를 설정하는 방법을 찾을 수는 없지만 방법이 있어야합니다. max_frame_size을 가져 오거나 설정하는이 Transport class이 있습니다.

메신저 API로 처음 시도한 다음 엔진 API로 작업했습니다. 전송 인스턴스에 액세스하는 방법을 알 수 없었습니다. Engine API의 경우에는 Connection.getTransport()이 있고이를 시도했지만이 함수를 호출 할 때 NULL입니다. 내가 자바의 매우 제한된 지식을 가지고 인정

private void do_test_with_frame_size(int frame_size, int payload_size) { 
    Connection conn = Connection.Factory.create(); 

    Transport transport = conn.getTransport(); 
    transport.setMaxFrameSize(frame_size); 

    Session session = conn.session(); 

    Sender sender = session.sender("sender"); 
    conn.open(); 
    session.open(); 
    sender.open(); 

    if (sender.getCredit() > 0) { 
     String uri = System.getProperty("broker_uri"); 
     assertNotNull(uri); 
     String address = String.format("%s/fragmentation-%d-%d", 
      uri, frame_size, payload_size); 

     Message message = Proton.message(); 
     message.setAddress(address); 
     message.setBody(new AmqpValue(new byte[payload_size])); 

     byte[] msgData = new byte[1024]; 
     int length; 
     while(true) { 
      try { 
       length = message.encode(msgData, 0, msgData.length); 
       break; 
      } catch(BufferOverflowException e) { 
       msgData = new byte[msgData.length * 2]; 
      } 
     } 
     byte[] tag = "0".getBytes(); 
     Delivery delivery = sender.delivery(tag); 
     sender.send(msgData, 0, length); 
     delivery.settle(); 
     sender.advance(); 
     sender.close(); 
     sender.getSession().close(); 
     sender.getSession().getConnection().close(); 
    } 
} 

:

여기 내 마지막 테스트입니다. 이 매개 변수를 설정하는 것이 가능하다는 것을 확인해 주시겠습니까? 그렇다면 어떻게해야합니까?

답변

1

연결 인스턴스를 만들어 연결 인스턴스에 사용하고 전송 인스턴스를 바인딩해야합니다. 생성 된 Connection에는 암시 적 전송이 바인딩되어 있지 않으므로 현재 null이 반환됩니다.

private final Transport protonTransport = Proton.transport(); 
private final Connection protonConnection = Proton.connection(); 

... 

this.protonTransport.setMaxFrameSize(maxFrameSize); 
this.protonTransport.setChannelMax(CHANNEL_MAX); 

this.protonTransport.bind(this.protonConnection); 
+0

'transport.bind (connection)'을 사용해 주셔서 감사합니다. 나는 당신의 대답을 받아 들일 것이다. 비록 나머지 테스트 프로그램이 작동하지 않기 때문에 (심지어 TCP 연결을 열지도 않는다 ...) 나는 완전히 테스트하지 못한다. Unforunately, 나는 이미이 클라이언트 라이브러리와 함께 너무 많은 시간을 보냈지 만 대신 .NET 라이브러리로 전환했습니다. –