RabbitMQ. Получение сообщений и их данных#
Полезные ссылки:
Получение сообщений#
import java.util.List;
import com.rabbitmq.client.GetResponse;
import static java.time.Duration.ofSeconds;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.GetResponseSupplier.responses;
public class MyTest {
@Test
public void myTest() {
//получение сообщений целиком
List<GetResponse> result = rabbitMq().read(response("test_queue") //название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
.autoAck() //можно указать, что auto acknowledge
//опции, уточняющие результат
//
);
}
}
Уточняющие параметры шага, который возвращает лист. Шаг предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//каждый элемент результирующего листа.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"каждый элемент, который попадет в результирующий лист", item -> {
/*предикат, как работает критерий*/
})
//-------------------------------------------
// можно указать время,
// за которое нужные элементы должны быть получены
.timeOut(ofSeconds(5))
//-------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если непустой лист не удалось получить (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой лист просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//-------------------------------------------
//1. можно указать сколько объектов,
//которые соответствуют критериям,
//нужно вернуть
.returnListOfSize(3)
//-------------------------------------------
//2. можно указать, до элемента с каким индексом
//нужно собрать результирующие элементы,
//индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnBeforeIndex(7)
//.returnAfterIndex(8) либо после какого элемента
//----------------------------------------------
//3. Либо можно перечислить индексы элементов,
// которые следует вернуть.
//Индексы - индексы объектов в наборе элементов,
//которые соответствуют критериям
.returnItemsOfIndexes(0, 3, 5)
//-----------------------------------------------
//4. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireSize(isEqual(8))
//----------------------------------------------
//5. можно указать, при достижении каких условий,
//которым должен соответствовать лист ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий лист/суб-лист
.returnOnCondition("Описание условия", list -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь суб-лист подходящих по критериям элементов,
// который должен вернуться как результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
Данные сообщений RabbitMQ, собранные в лист#
import java.util.List;
import com.rabbitmq.client.GetResponse;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.GetResponseSupplier.responses;
public class MyTest {
@Test
public void myTest() {
List<SomeData> someDataList = rabbitMq().read(response(/*параметры*/)
//опции, уточняющие результат
//
.thenGetList(
"Описание / название результирующего листа", //описание того ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
getResponse -> {
//Алгоритм функции, которая получает данные
//из каждого сообщения
return someDataObject; //эти объекты
//будут собраны в результирующий лист
}
)
//опции, уточняющие результат
//
);
}
}
Уточняющие параметры шага, который возвращает лист. Шаг не предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//каждый элемент результирующего листа.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"каждый элемент, который попадет в результирующий лист", item -> {
/*предикат, как работает критерий*/
})
//-------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если непустой лист не удалось получить (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой лист просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//-------------------------------------------
//1. можно указать сколько объектов,
//которые соответствуют критериям,
//нужно вернуть
.returnListOfSize(3)
//-------------------------------------------
//2. можно указать, до элемента с каким индексом
//нужно собрать результирующие элементы,
//индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnBeforeIndex(7)
//.returnAfterIndex(8) либо после какого элемента
//----------------------------------------------
//3. Либо можно перечислить индексы элементов,
// которые следует вернуть.
//Индексы - индексы объектов в наборе элементов,
//которые соответствуют критериям
.returnItemsOfIndexes(0, 3, 5)
//-------------------------------------------
//4. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireSize(isEqual(8))
//-------------------------------------------
//5. можно указать, при достижении каких условий,
//которым должен соответствовать лист ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий лист/суб-лист
.returnOnCondition("Описание условия", list -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь суб-лист подходящих по критериям элементов,
// который должен вернуться как результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
import java.util.List;
import com.rabbitmq.client.GetResponse;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.GetResponseSupplier.responses;
public class MyTest {
@Test
public void myTest() {
List<SomeData> someDataList = rabbitMq().read(response(/*параметры*/)
//опции, уточняющие результат
//
.thenGetList(
"Описание / название результирующего листа", //описание того ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект List<SomeBodyClass>.
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someDataObject; //эти объекты
//будут собраны в результирующий лист
}
)
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//опции, уточняющие результат
//
);
}
}
Объект данных из сообщений RabbitMQ#
import java.util.List;
import com.rabbitmq.client.GetResponse;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.GetResponseSupplier.responses;
public class MyTest {
@Test
public void myTest() {
SomeData someData = rabbitMq().read(response(/*параметры*/)
//опции, уточняющие результат
//
.thenGetItem(
"Описание / название результирующего объекта", //описание того
// ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
getResponse -> {
//Алгоритм функции, которая получает данные
//из каждого сообщения
return someDataObject; //один из этих
//объектов возвращается как результат,
//первый попавшийся или с учетом уточнений
})
//опции, уточняющие результат
//
);
}
}
Уточняющие параметры шага, который возвращает элемент Iterable>. Шаг не предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//результирующий элемент из набора.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"результирующий элемент из набора", item -> {
/*предикат, как работает критерий*/
})
//------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если не был получен результирующий элемент (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой набор просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//------------------------------------------
//1. Можно указать индекс элемента, который следует вернуть.
//Индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnItemOfIndex(1)
//-----------------------------------------------
//2. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireSize(isEqual(8))
//------------------------------------------
//3. можно указать, при достижении каких условий,
//которым должен соответствовать набор ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий элемент
.returnOnCondition("Описание условия", iterable -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь набор подходящих по критериям элементов,
// из которого должен быть взят результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
import java.util.List;
import com.rabbitmq.client.GetResponse;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.GetResponseSupplier.responses;
public class MyTest {
@Test
public void myTest() {
SomeData someData = rabbitMq().read(response(/*параметры*/)
//опции, уточняющие результат
//
.thenGetItem(
"Описание / название результирующего объекта", //описание того
// ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект SomeBodyClass.
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someDataObject; //один из этих
//объектов возвращается как результат,
//первый попавшийся или с учетом уточнений
}
)
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//опции, уточняющие результат
//
);
}
}
Получение данных сообщений#
Отличие от примеров выше в том, что здесь нет промежуточного действия в виде получения сообщений, из которых извлекаются данные. Данные получаются как бы напрямую.
Получение данных сообщений RabbitMQ как Java-объект#
import static java.time.Duration.ofSeconds;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetIterableItemSupplier.*;
public class MyTest {
@Test
public void myTest() {
SomeData result = rabbitMq().read(rabbitIterableItem(
"Описание / название результирующего объекта", //описание того
// ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
"test_queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект SomeBodyClass.
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someDataObject; //один из этих
//объектов возвращается как результат,
//первый попавшийся или с учетом уточнений
})
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат
//
);
}
}
Уточняющие параметры шага, который возвращает элемент Iterable>. Шаг предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//результирующий элемент из набора.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"результирующий элемент из набора", item -> {
/*предикат, как работает критерий*/
})
//------------------------------------------
// можно указать время,
// за которое нужные элемент должен быть получен
.timeOut(ofSeconds(5))
//------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если не был получен результирующий элемент (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой набор просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//------------------------------------------
//1. Можно указать индекс элемента, который следует вернуть.
//Индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnItemOfIndex(1)
//-----------------------------------------------
//2. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireSize(isEqual(8))
//------------------------------------------
//3. можно указать, при достижении каких условий,
//которым должен соответствовать набор ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий элемент
.returnOnCondition("Описание условия", iterable -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь набор подходящих по критериям элементов,
// из которого должен быть взят результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
Ниже пример, как можно получить текст одного из прочитанных сообщений
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetIterableItemSupplier.*;
public class MyTest {
@Test
public void myTest() {
// Возвращает сообщение из очереди.
String result = rabbitMq().read(rabbitRawMessage(
"queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
UTF_8) //Кодировка, параметр необязательный
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат,
//
);
}
}
Получение данных сообщений RabbitMQ, собранных в лист#
import java.util.List;
import static java.time.Duration.ofSeconds;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetIterableSupplier.*;
public class MyTest {
@Test
public void myTest() {
List<SomeData> result = rabbitMq().read(rabbitIterable(
"Описание / название результирующего листа", //описание того ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
"test_queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект List<SomeBodyClass>.
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someDataObject; //эти объекты
//будут собраны в результирующий лист
})
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат
//
);
}
}
Уточняющие параметры шага, который возвращает лист. Шаг предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//каждый элемент результирующего листа.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"каждый элемент, который попадет в результирующий лист", item -> {
/*предикат, как работает критерий*/
})
//-------------------------------------------
// можно указать время,
// за которое нужные элементы должны быть получены
.timeOut(ofSeconds(5))
//-------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если непустой лист не удалось получить (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой лист просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//-------------------------------------------
//1. можно указать сколько объектов,
//которые соответствуют критериям,
//нужно вернуть
.returnListOfSize(3)
//-------------------------------------------
//2. можно указать, до элемента с каким индексом
//нужно собрать результирующие элементы,
//индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnBeforeIndex(7)
//.returnAfterIndex(8) либо после какого элемента
//----------------------------------------------
//3. Либо можно перечислить индексы элементов,
// которые следует вернуть.
//Индексы - индексы объектов в наборе элементов,
//которые соответствуют критериям
.returnItemsOfIndexes(0, 3, 5)
//-----------------------------------------------
//4. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireSize(isEqual(8))
//----------------------------------------------
//5. можно указать, при достижении каких условий,
//которым должен соответствовать лист ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий лист/суб-лист
.returnOnCondition("Описание условия", list -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь суб-лист подходящих по критериям элементов,
// который должен вернуться как результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
Ниже пример, как можно получить тексты прочитанных сообщений
import java.util.List;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetIterableSupplier.*;
public class MyTest {
@Test
public void myTest() {
// Возвращает сообщения из очереди.
List<String> result = rabbitMq().read(rabbitIterableOfRawMessages(
"queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
UTF_8) //Кодировка, параметр необязательный
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат,
//
);
}
}
Получение данных сообщений RabbitMQ, собранных в массив#
import static java.time.Duration.ofSeconds;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetArraySupplier.*;
public class MyTest {
@Test
public void myTest() {
ArrayItemClass[] result = rabbitMq().read(rabbitArray(
"Описание / название результирующего массива", //описание того ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
"test_queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
ArrayItemClass.class, //Класс каждого элемента получаемого массива
// Параметр обязателен, если из каждого десериализованного
// тела сообщения нужно получить какие-то данные,
// из которых будет собран результирующий массив.
// Получение этих данных описывается функцией ниже.
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект SomeBodyClass[]
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someArrayItemObject; //эти объекты
//будут собраны в результирующий массив
})
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат,
//
);
}
}
Уточняющие параметры шага, который возвращает массив. Шаг предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//каждый элемент результирующего массива.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"каждый элемент, который попадет в результирующий массив", item -> {
/*предикат, как работает критерий*/
})
//----------------------------------------------
// можно указать время,
// за которое нужные элементы должны быть получены
.timeOut(ofSeconds(5))
//----------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если непустой массив не удалось получить (не было ни одного элемента,
//который бы соответствовал перечисленным критериям,
// или непустой массив просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//----------------------------------------------
//1. можно указать сколько объектов,
//которые соответствуют критериям,
//нужно вернуть
.returnArrayOfLength(3)
//-------------------------------------------
//2. можно указать, до элемента с каким индексом
//нужно собрать результирующие элементы,
//индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnBeforeIndex(7)
//.returnAfterIndex(8) либо после какого элемента
//----------------------------------------------
//3. Либо можно перечислить индексы элементов,
// которые следует вернуть.
//Индексы - индексы объектов в наборе элементов,
//которые соответствуют критериям
.returnItemsOfIndexes(0, 3, 5)
//-----------------------------------------------
//4. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireLength(isEqual(8))
//----------------------------------------------
//5. можно указать, при достижении каких условий,
//которым должен соответствовать массив ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий массив/суб-массив
.returnOnCondition("Описание условия", array -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь суб-массив подходящих по критериям элементов,
// который должен вернуться как результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием
Ниже пример, как можно получить тексты прочитанных сообщений в виде массива
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetArraySupplier.*;
public class MyTest {
@Test
public void myTest() {
// Возвращает сообщения из очереди.
String[] result = rabbitMq().read(rabbitArrayOfRawMessages(
"queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
UTF_8) //Кодировка, параметр необязательный
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат,
//
);
}
}
Получение данных сообщений RabbitMQ как элемент массива#
import static java.time.Duration.ofSeconds;
import static ru.tinkoff.qa.neptune.rabbit.mq.RabbitMqStepContext.rabbitMq;
import static ru.tinkoff.qa.neptune.rabbit.mq.function.get.RabbitMqBasicGetArrayItemSupplier.*;
public class MyTest {
@Test
public void myTest() {
ArrayItemClass result = rabbitMq().read(rabbitArrayItem(
"Описание / название результирующего элемента массива", //описание того ЧТО следует получить,
//в свободной форме или бизнес
//терминологии
"test_queue", //Название очереди
//Параметр необязательный. Если его не указывать, будет использовано значение
//свойства RABBIT_MQ_DEFAULT_QUEUE_NAME
SomeBodyClass.class, //Класс, в объект которого
// десериализуется тело каждого сообщения.
// Так же можно использовать объект
// com.fasterxml.jackson.core.type.TypeReference
//
ArrayItemClass.class, //Класс каждого элемента массива, из
// которого будет выбран результирующий объект.
// Параметр обязателен, если из каждого десериализованного
// тела сообщения нужно получить какие-то данные,
// из которых будет выбран результат.
//
// Функция, с помощью которой извлекаются данные
// из десериализованного тела сообщения.
// Она не обязательная. Если ее не указывать,
// то вернется объект SomeBodyClass
someBodyObject -> {
//Алгоритм функции, которая получает данные
//из каждого десериализованного тела сообщения
return someArrayItemObject; //один из этих
//объектов возвращается как результат,
//первый попавшийся или с учетом уточнений
})
// Указывается объект класса
// ru.tinkoff.qa.neptune.core.api.data.format.DataTransformer,
// c помощью которого десериализуется тело каждого сообщения.
// Вызов метода необязателен. По умолчанию используется
// значение свойства RABBIT_MQ_DEFAULT_DATA_TRANSFORMER
.withDataTransformer(new CustomDataTransformer())
//можно указать, что auto acknowledge
.autoAck()
//опции, уточняющие результат,
//
);
}
}
Уточняющие параметры шага, который возвращает элемент массива. Шаг предусматривает время на ожидание
//Можно указать один или несколько критериев,
//которым должен соответствовать
//результирующий элемент из массива.
// Так же доступны criteriaOr(criteria...),
// criteriaOnlyOne(criteria...)
// criteriaNot(criteria...)
.criteria("Описание критерия, которому должен соответствовать " +
"результирующий элемент из массива", item -> {
/*предикат, как работает критерий*/
})
//------------------------------------------
// можно указать время,
// за которое нужные элемент должен быть получен
.timeOut(ofSeconds(5))
//-----------------------------------------------
//Можно указать, что должно быть выброшено исключение,
// если не был получен результирующий элемент (не было ни одного элемента,
// который бы соответствовал перечисленным критериям,
// или непустой массив просто не был получен)
.throwOnNoResult()
//ТАКЖЕ ЕСТЬ СЛЕДУЮЩИЕ ОПЦИИ:
//-----------------------------------------------
//1. Можно указать индекс элемента, который следует вернуть.
//Индекс - индекс объекта в наборе элементов,
//которые соответствуют критериям
.returnItemOfIndex(1)
//-----------------------------------------------
//2. можно указать, при достижении какого количества
//ВСЕХ объектов, которые соответствуют критериям,
//должен быть возвращен результат
.returnIfEntireLength(isEqual(8))
//-----------------------------------------------
//3. можно указать, при достижении каких условий,
//которым должен соответствовать набор ВСЕХ объектов,
//соответствующих критериям,
//можно возвращать результирующий элемент
.returnOnCondition("Описание условия", array -> {
/*предикат, как работает критерий*/
})
//так же доступны returnOnConditionOr(criteria...),
// returnOnConditionOnlyOne(criteria...)
// returnOnConditionNot(criteria...)
//------------------------------------------
//Если не нашлось столько подходящих объектов, чтобы вернуть результат,
//или весь суб-массив подходящих по критериям элементов,
// из которого должен быть взят результат,
// не соответствует каким-то критериям -
// будет выброшено исключение с подробным описанием