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 .