Перейти к основному содержимому

Apache Ignite с данными Spring

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В этом кратком руководстве мы сосредоточимся на том, как интегрировать Spring Data API с платформой Apache Ignite.

Чтобы узнать об Apache Ignite, ознакомьтесь с нашим предыдущим руководством .

2. Настройка Мавена

В дополнение к существующим зависимостям мы должны включить поддержку Spring Data:

<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring-data</artifactId>
<version>${ignite.version}</version>
</dependency>

Артефакт ignite-spring-data можно скачать с Maven Central .

3. Модель и репозиторий

Чтобы продемонстрировать интеграцию, мы создадим приложение, которое хранит сотрудников в кеше Ignite с помощью Spring Data API.

POJO для EmployeeDTO будет выглядеть так:

public class EmployeeDTO implements Serializable {

@QuerySqlField(index = true)
private Integer id;

@QuerySqlField(index = true)
private String name;

@QuerySqlField(index = true)
private boolean isEmployed;

// getters, setters
}

Здесь аннотация @QuerySqlField позволяет запрашивать поля с помощью SQL.

Далее мы создадим репозиторий для сохранения объектов Employee :

@RepositoryConfig(cacheName = "foreachCache")
public interface EmployeeRepository
extends IgniteRepository<EmployeeDTO, Integer> {
EmployeeDTO getEmployeeDTOById(Integer id);
}

Apache Ignite использует собственный IgniteRepository , который является продолжением CrudRepository от Spring Data . Он также обеспечивает доступ к сетке SQL из Spring Data. ** **

Это поддерживает стандартные методы CRUD, за исключением некоторых, которым не требуется идентификатор. Мы рассмотрим причины более подробно в нашем разделе тестирования.

Аннотация @RepositoryConfig сопоставляет EmployeeRepository с foreachCache Ignite .

4. Конфигурация пружины

Давайте теперь создадим наш класс конфигурации Spring.

Мы будем использовать аннотацию @EnableIgniteRepositories , чтобы добавить поддержку репозиториев Ignite:

@Configuration
@EnableIgniteRepositories
public class SpringDataConfig {

@Bean
public Ignite igniteInstance() {
IgniteConfiguration config = new IgniteConfiguration();

CacheConfiguration cache = new CacheConfiguration("foreachCache");
cache.setIndexedTypes(Integer.class, EmployeeDTO.class);

config.setCacheConfiguration(cache);
return Ignition.start(config);
}
}

Здесь метод igniteInstance() создает и передает экземпляр Ignite в IgniteRepositoryFactoryBean , чтобы получить доступ к кластеру Apache Ignite.

Мы также определили и установили конфигурацию foreachCache . Метод setIndexedTypes() устанавливает схему SQL для кеша.

5. Тестирование репозитория

Для тестирования приложения зарегистрируем SpringDataConfiguration в контексте приложения и получим из него EmployeeRepository :

AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext();
context.register(SpringDataConfig.class);
context.refresh();

EmployeeRepository repository = context.getBean(EmployeeRepository.class);

Затем мы хотим создать экземпляр EmployeeDTO и сохранить его в кеше:

EmployeeDTO employeeDTO = new EmployeeDTO();
employeeDTO.setId(1);
employeeDTO.setName("John");
employeeDTO.setEmployed(true);

repository.save(employeeDTO.getId(), employeeDTO);

Здесь мы использовали метод сохранения (ключ, значение ) IgniteRepository . Причина этого в том, что стандартные операции CrudRepository save(entity), save(entities), delete(entity) пока не поддерживаются .

Проблема заключается в том, что идентификаторы, сгенерированные методом CrudRepository.save() , не уникальны в кластере.

Вместо этого мы должны использовать методы save (key, value), save (Map<ID, Entity> values), deleteAll (Iterable<ID> ids) .

После этого мы можем получить объект сотрудника из кеша, используя метод Spring Data getEmployeeDTOById() :

EmployeeDTO employee = repository.getEmployeeDTOById(employeeDTO.getId());
System.out.println(employee);

Вывод показывает, что мы успешно получили исходный объект:

EmployeeDTO{id=1, name='John', isEmployed=true}

В качестве альтернативы мы можем получить тот же объект с помощью IgniteCache API:

IgniteCache<Integer, EmployeeDTO> cache = ignite.cache("foreachCache");
EmployeeDTO employeeDTO = cache.get(employeeId);

Или с помощью стандартного SQL:

SqlFieldsQuery sql = new SqlFieldsQuery(
"select * from EmployeeDTO where isEmployed = 'true'");

6. Резюме

В этом кратком руководстве показано, как интегрировать Spring Data Framework с проектом Apache Ignite. С помощью практического примера мы научились работать с кешем Apache Ignite с помощью Spring Data API.

Как обычно, полный код этой статьи доступен в проекте GitHub .