Machamp: поддержка SQL Server
Асинхронную обработку задач я впервые использовал в 2007 году в Яндекс.Деньгах под руководством Фила Дельгядо. Потом много раз рассказывал про это на конференциях, написал статью, но делать отдельную библиотеку не планировал. Базы данных у всех разные, unit-тестов нет, да и потратить неделю-две на разработку ключевого компонента — разумная альтернатива интеграции со сторонней библиотекой.
С тех пор у меня было много проектов, на которых я использовал асинхронную обработку задач и я каждый раз писал её заново: с разными базами данных, без Spring, на Spring Boot, на Ktor, сначала на Java, потом на Kotlin.
В прошлом году у меня на работе сложилась такая ситуация, что через пару месяцев нужно показать прототип, а в ближайшее время нужно заниматься другими задачами. И тут внезапно оказалось, что времена изменились и база данных у всех одна: PostgreSQL, в Spring Boot прекрасно интегрируются сторонние компоненты, тесты можно написать при помощи Testcontainers, а заказчикам очень нравится программное обеспечение с открытым исходным кодом. И опыта у меня накопилось достаточно, чтобы можно было уверенно сделать свою библиотеку.
Я на выходных написал machamp, выложил его на GitHub, настроил публикацию в Maven Central Repository, а потом успешно применил на работе. С тестами у меня проблем не возникло, потому что уже был приличный опыт с Testcontainers, а вот с публикацией артефактов пришлось повозиться — но ничего сложного в этом нет, просто немного муторно. И при поиске работы в Израиле свой open-source проект, да ещё и с успешным внедрением мне очень пригодился.
Не удивительно, что на моей нынешней работе тоже пришло время использовать machamp, но вот наша основная база — SQL Server, поэтому пришлось добавить его поддержку. С точки зрения гибкости у Spring всё в порядке, как писать единственный нетривиальный SQL-запрос мне рассказали много лет назад, а вот с тестами возникли проблемы. Testcontainers инициализируется статическими методами и dependency injection не помогает заменить базу данных. В конце концов, я просто продублировал тесты.
В ближайшее время собираюсь добавить поддержку Oracle и MySQL.