Метаданные бинарного типа#
Коды операций#
После успешного подтверждения подключения к узлу сервера DataGrid клиент может выполнять операции с данными бинарного типа. Клиент отправляет запрос (подробнее о структуре запросов и ответов написано в разделах ниже) с конкретным кодом операции:
Операция |
Код операции |
|---|---|
|
3000 |
|
3001 |
|
3002 |
|
3003 |
|
0 |
Указанные выше коды операций являются частью заголовка запроса — подробнее написано в подразделе «Стандартный заголовок сообщения» раздела «Обзор бинарного протокола клиента».
Пользовательские методы, которые используются при реализации примеров фрагментов кода ниже
В некоторых примерах кода ниже используются:
метод
readDataObject(), который описан в подразделе «Объекты данных» раздела «Обзор бинарного протокола клиента»;методы, которые используют порядок байтов little-endian для чтения и записи значений, состоящих из нескольких байтов — они включены в раздел «Формат данных».
OP_GET_BINARY_TYPE_NAME#
Получает по идентификатору полное бинарное название типа, которое зависит от платформы. Например, .NET и Java могут отображаться как один тип Foo, но классы будут называться по-разному:
Apache.Ignite.Fooв .NET;org.apache.ignite.Fooв Java.
Названия типов регистрируются с помощью операции OP_REGISTER_BINARY_TYPE_NAME.
Тип поля запроса |
Описание |
|---|---|
|
Заголовок запроса |
|
Идентификатор платформы:
|
|
Идентификатор типа; хеш-код названия типа в Java-стиле |
Тип поля ответа |
Описание |
|---|---|
|
Заголовок ответа |
|
Название бинарного типа |
String type = "ignite.myexamples.model.Person";
int typeLen = type.getBytes("UTF-8").length;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Заголовок запроса.
writeRequestHeader(5, OP_GET_BINARY_TYPE_NAME, 1, out);
// Идентификатор платформы.
writeByteLittleEndian(0, out);
// Идентификатор типа.
writeIntLittleEndian(type.hashCode(), out);
// Прочитать результаты.
DataInputStream in = new DataInputStream(socket.getInputStream());
// Заголовок ответа.
readResponseHeader(in);
// Результирующая строка.
int typeCode = readByteLittleEndian(in); // Код типа.
int strLen = readIntLittleEndian(in); // Длина.
byte[] buf = new byte[strLen];
readFully(in, buf, 0, strLen);
String s = new String(buf);
System.out.println(s);
OP_GET_BINARY_TYPE#
Получает информацию о бинарном типе данных по идентификатору.
Тип поля запроса |
Описание |
|---|---|
|
Заголовок запроса |
|
Идентификатор типа; хеш-код названия типа в Java-стиле |
Тип поля ответа |
Описание |
|---|---|
|
Заголовок ответа |
|
|
|
Идентификатор типа; хеш-код названия типа в Java-стиле |
|
Название типа |
|
Название поля affinity-ключа |
|
Количество значений |
|
Структура параметра
|
|
Является ли типом Если установлено значение |
|
Передавайте, только если у параметра |
|
Передавайте, только если у параметра Повторяется столько раз, сколько полей указано в предыдущем параметре |
|
Количество схем |
|
Структура параметра
Повторяется столько раз, сколько схем указано в предыдущем параметре |
tring type = "ignite.myexamples.model.Person";
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Заголовок запроса.
writeRequestHeader(4, OP_BINARY_TYPE_GET, 1, out);
// Идентификатор типа.
writeIntLittleEndian(type.hashCode(), out);
// Прочитать результаты.
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);
boolean typeExist = readBooleanLittleEndian(in);
int typeId = readIntLittleEndian(in);
String typeName = readString(in);
String affinityFieldName = readString(in);
int fieldCount = readIntLittleEndian(in);
for (int i = 0; i < fieldCount; i++)
readBinaryTypeField(in);
boolean isEnum = readBooleanLittleEndian(in);
int schemaCount = readIntLittleEndian(in);
// Прочитать бинарные схемы.
for (int i = 0; i < schemaCount; i++) {
int schemaId = readIntLittleEndian(in); // Идентификатор схемы.
int fieldCount = readIntLittleEndian(in); // Количество полей.
for (int j = 0; j < fieldCount; j++) {
System.out.println(readIntLittleEndian(in)); // Идентификатор поля.
}
}
private static void readBinaryTypeField (DataInputStream in) throws IOException{
String fieldName = readString(in);
int fieldTypeId = readIntLittleEndian(in);
int fieldId = readIntLittleEndian(in);
System.out.println(fieldName);
}
OP_REGISTER_BINARY_TYPE_NAME#
Регистрирует по идентификатору полное бинарное название типа, которое зависит от платформы. Например, .NET и Java могут отображаться как один тип Foo, но классы будут называться по-разному:
Apache.Ignite.Fooв .NET;org.apache.ignite.Fooв Java.
Тип поля запроса |
Описание |
|---|---|
|
Заголовок запроса |
|
Идентификатор платформы:
|
|
Идентификатор типа; хеш-код названия типа в Java-стиле |
|
Название типа |
Тип поля ответа |
Описание |
|---|---|
|
Заголовок ответа |
String type = "ignite.myexamples.model.Person";
int typeLen = type.getBytes("UTF-8").length;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Заголовок запроса.
writeRequestHeader(20 + typeLen, OP_PUT_BINARY_TYPE_NAME, 1, out);
// Идентификатор платформы.
writeByteLittleEndian(0, out);
// Идентификатор типа.
writeIntLittleEndian(type.hashCode(), out);
// Название типа.
writeString(type, out);
// Прочитать результаты.
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);
OP_PUT_BINARY_TYPE#
Регистрирует информацию о бинарном типе данных в кластере.
Тип поля запроса |
Описание |
|---|---|
|
Заголовок запроса |
|
Идентификатор типа; хеш-код названия типа в Java-стиле |
|
Название типа |
|
Название поля affinity-ключа |
|
Количество значений |
|
Структура параметра
Повторяется столько раз, сколько значений указано в предыдущем параметре |
|
Является ли типом Если установлено значение |
|
Передавайте, только если у параметра Количество полей типа |
|
Передавайте, только если у параметра Значения типа Повторяется столько раз, сколько полей указано в предыдущем параметре |
|
Количество переданных структур |
|
Структура параметра
Повторяется столько раз, сколько структур указано в предыдущем параметре |
Тип поля ответа |
Описание |
|---|---|
|
Заголовок ответа |
String type = "ignite.myexamples.model.Person";
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Заголовок запроса.
writeRequestHeader(120, OP_BINARY_TYPE_PUT, 1, out);
// Идентификатор типа.
writeIntLittleEndian(type.hashCode(), out);
// Название типа.
writeString(type, out);
// Название поля affinity-ключа.
writeByteLittleEndian(101, out);
// Количество полей.
writeIntLittleEndian(3, out);
// Первое поле.
String field1 = "id";
writeBinaryTypeField(field1, "long", out);
// Второе поле.
String field2 = "name";
writeBinaryTypeField(field2, "String", out);
// Третье поле.
String field3 = "salary";
writeBinaryTypeField(field3, "int", out);
// `isEnum` — является ли типом `enum` или нет.
out.writeBoolean(false);
// Количество схем.
writeIntLittleEndian(1, out);
// Схема.
writeIntLittleEndian(657, out); // Идентификатор схемы; может принимать любое пользовательское значение.
writeIntLittleEndian(3, out); // Количество полей.
writeIntLittleEndian(field1.hashCode(), out);
writeIntLittleEndian(field2.hashCode(), out);
writeIntLittleEndian(field3.hashCode(), out);
private static void writeBinaryTypeField (String field, String fieldType, DataOutputStream out) throws IOException{
writeString(field, out);
writeIntLittleEndian(fieldType.hashCode(), out);
writeIntLittleEndian(field.hashCode(), out);
}
// Прочитать результаты.
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);