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.3SqlErrorCodec 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