11 Aralık 2022 Pazar

Client Protocol

Giriş
Client procotol ayrı bir proje. Her servis için bir yaml dosyası var. Bu dosyada metodlar tanımlı. Java kodu üretmek için önce bazı paketlerin kurulması gerekiyor. Şöyle yaparız
pip3 install -r requirements.txt
Daha sonra sadece java sınıfı üretmek için şöyle yaparız
 ./generator.py --no-binary -r ~/IdeaProjects/hazelcast/
Üretilen kodlar şu pakette
com.hazelcast.client.impl.protocol.codec
Eğer yeni bir alan falan eklediysek testleri de yeniden üretmek gerekiyor. Şöyle yaparız
 ./generator.py -r ~/IdeaProjects/hazelcast/
Yaml dosyasında her parametre için since diye bir alan var. Bu alan Hazelcast sürümü değil, client protocol sürümü. Yani since: 2.5 şeklinde yazmak gerekiyor.

retryable alanı - Mesaj İçindir
ClientInvocation Sınıfı TargetDisconnectedException exception gelirse çağrıyı tekrar dener

Örnek
Şöyle yaparız
- id: 17
    name: uploadJobMetaData
    since: 2.6
    doc: ''
    request:
      retryable: true
      partitionIdentifier: -1
      params:
        ...
    response: {}
response Alanı
Örnek
Şöyle yaparız
- id: 15
    name: getJobAndSqlSummaryList
    since: 2.5
    doc: ''
    request:
      retryable: true
      partitionIdentifier: -1
      params: []
    response:
      params:
        - name: response
          type: List_JobAndSqlSummary
          nullable: false
          since: 2.5
          doc: ''
Response Yani Cevap Mesajına Yeni Alan Ekleme
Örnek
Şöyle yaparız. Eğer üye alanın since değeri başlangıçtan farklı ise codec içinde abcExists şeklinde bir boolean daha üretiliyor.
- name: SqlError
  since: 2.1
  params:
    - name: code
      type: int
      nullable: false
      since: 2.1
    - name: message
      type: String
      nullable: true
      since: 2.1
    - name: originatingMemberId
      type: UUID
      nullable: false
      since: 2.1
    - name: suggestion
      type: String
      nullable: true
      since: 2.3
SqlErrorCodec için üretilen kod şöyle. Burada sonradan eklenen suggestion alanı için isSuggestionExists boolean görülebilir
public static com.hazelcast.sql.impl.client.SqlError decode(
  ClientMessage.ForwardFrameIterator iterator) {
  // begin frame
  iterator.next();

  ClientMessage.Frame initialFrame = iterator.next();
  int code = decodeInt(...;
  java.util.UUID originatingMemberId = decodeUUID(...);

  java.lang.String message = CodecUtil.decodeNullable(...);
  boolean isSuggestionExists = false;
  java.lang.String suggestion = null;
  if (!iterator.peekNext().isEndFrame()) {
    suggestion = CodecUtil.decodeNullable(iterator, StringCodec::decode);
    isSuggestionExists = true;
  }
  ...
  return new com.hazelcast.sql.impl.client.SqlError(
    code, message, originatingMemberId, isSuggestionExists, suggestion, ...);
}
Codec değiştiği için mesajın constructor metodu da değişiyor. Constructor değişirse testlerde kullanılan ReferenceObjects kodu da değişiyor. 

Eğer mesaj nesnesi custom ise yani otomatik üretilmiyorsa sınıfın equals() ve hashCode () metodlarını değiştirmek gerekiyor. Yoksa ClientCompatibilityTest_A_B veya MemberCompatibilityTest_A_B  
gibi testler başarısız olmaya başlıyor. Response mesajın elle kodlandığı için şöyle yapmak gerekir
@Override
public boolean equals(Object o) {
  ...
  if (suggestionExists && sqlError.suggestionExists) {
    if (!Objects.equals(suggestion, sqlError.suggestion)) {
      return false;
    }
  }
  ...
  return true;
}
Burada hem bende hem de karşıda suggestionExists bayrakları TRUE ise suggestion alanları karşılaştırılıyor. Böylece 
- yeni client eski member'dan mesaj alsa bile mesajı işleyebilir, çünkü karşı mesajdaki suggestionExists değeri FALSE
- eski client yeni member'dan mesaj alsa bile mesajı işleyebilir çünkü client açısından böyle bir alan yok




Hiç yorum yok:

Yorum Gönder

THIRD-PARTY.txt Dosyası

Kullanılan harici kütüphanelerin sürümleri bu dosyada Dosyanın yolu şöyle hazelcast/licenses/THIRD-PARTY.txt