Apache Ignite с помощью Spring Data

Apache Ignite с помощью Spring Data

1. обзор

В этом кратком руководстве мы сосредоточимся наhow to integrate the Spring Data API with the Apache Ignite platform.

Чтобы узнать об Apache Ignite, посетитеour previous guide.

2. Maven Setup

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


    org.apache.ignite
    ignite-spring-data
    ${ignite.version}

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

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

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

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

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 = "exampleCache")
public interface EmployeeRepository
  extends IgniteRepository {
    EmployeeDTO getEmployeeDTOById(Integer id);
}

Apache Ignite uses its own IgniteRepository which extends from Spring Data’s CrudRepository. Он также обеспечивает доступ к сетке SQL из Spring Data. 

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

АннотацияThe @RepositoryConfig отображаетEmployeeRepository наexampleCache Ignite.

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

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

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

@Configuration
@EnableIgniteRepositories
public class SpringDataConfig {

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

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

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

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

Мы также определили и установили конфигурациюexampleCache. Метод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);

Здесь мы использовали методsave(key, value) дляIgniteRepository. Причина в том, чтоthe standard CrudRepository save(entity), save(entities), delete(entity) operations aren’t supported yet.

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

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

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

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

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

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

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

IgniteCache cache = ignite.cache("exampleCache");
EmployeeDTO employeeDTO = cache.get(employeeId);

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

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

6. Резюме

В этом коротком руководстве показано, как интегрировать Spring Data Framework с проектом Apache Ignite. На практическом примереwe learned to work with the Apache Ignite cache by using the Spring Data API.

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