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