Статьи

Модульное управление фермой на платформе NetBeans

В настоящее время я работаю в Ordina инженером-программистом и техническим архитектором.

Ниже приведен обзор « AgroSense », представляющего собой платформу с расширенными возможностями и предоставляющую высокомодульную систему управления фермой на платформе NetBeans:

Обзор «АгроСенс»

Сельское хозяйство быстро становится отраслью с большим объемом данных. Для преобразования всех этих данных в полезную информацию по управлению фермой требуется множество сельскохозяйственных специальностей, что может привести к повышению производительности, снижению использования пестицидов и т. Д. Специфические знания в области сельского хозяйства часто принадлежат небольшим компаниям, которые не способны создать конкурентоспособную ферму в целом. система управления.

AgroSense предоставляет модульную структуру с открытым исходным кодом, в которой модули из нескольких источников объединяются в единую интегрированную систему управления фермой. Модули могут предоставляться правительственными департаментами, университетами или коммерческими предприятиями. Некоторые из них будут бесплатными, в то время как другие потребуют какой-либо формы оплаты. В конце
фермер решает, какие модули способствуют бизнесу:

 

История применения

Это было мое первое приложение для rich-client, основанное на Maven. Ранее мы создали несколько приложений на платформе NetBeans на основе Ant. Сначала казалось, что обертки библиотеки Ant больше не нужны. Добавление вещей, которые нам нужны, так как зависимости модуля работали нормально, пока мы не создали наш второй модуль и не начали использовать API первого. Нам потребовалось несколько дней охоты на гремлинов, прежде чем мы пришли к выводу, что нам все еще нужны обертки для модулей. Добавив их в нашу модульную архитектуру и придерживаясь проектных зависимостей, мы решили эту проблему.

Вторая проблема, которую нужно было решить, — это наш уровень постоянства. Мы хотели поддерживать несколько единиц персистентности, но по-прежнему контролировать нашу базу данных. Мы решили эту головоломку, создав три модуля базы данных, а также оболочку библиотеки Hibernate / hsqldb.

Модуль API базы данных содержит интерфейс, описывающий, как модули должны заявить о себе, т. Е. Как желающие что-то делать с постоянством (имя модуля постоянства и т. Д.), И интерфейс для получения «EntityManager». Второй модуль содержит нашу тестовую реализацию базы данных, он обеспечивает соединение «EntityManager» с базой данных Derby в памяти и предполагает постоянный модуль с именем «test». Третий модуль содержит нашу локальную базу данных.

Локальная база данных «EntityManagerProvider» создает фабрику «EntityManager» для каждого модуля, которая предоставляет информацию о постоянстве через механизм поставщика услуг, т. Е. Реализации интерфейса «PersistingModule» в модуле API базы данных. Это приводит к соединению на единицу постоянства. Поскольку Derby допускает только одно соединение с базой данных, нам пришлось переключиться на hsqldb.

С помощью небольшого вспомогательного класса нам удалось заставить Hibernate подыграть:

public class JavaAssistHelper {
    public static ClassLoaderProvider createJavaAssistClassLoader() {
        ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() {
            public ClassLoader get(ProxyFactory pf) {
                return Thread.currentThread().getContextClassLoader();
            }
        };
        return ProxyFactory.classLoaderProvider;
    }
}

В нашем проекте мы хотим поддерживать сторонние модули, которые должны иметь возможность общаться с другими модулями. Например, модуль, реализующий бизнес-процесс для уборки урожая, должен иметь возможность извлекать информацию о погоде из реализации модуля погоды. Нам нужны не только эти модули для взаимодействия друг с другом, но и большая часть данных должна храниться в базе данных.

В основном у нас было два варианта: первый — разделить модель данных и определить объекты в модуле API, например, объект «WeatherReport» в модуле Weather API и объект «SensorRun» в модуле API датчика. Сначала казалось, что это путь. Мы любим модульность. Но пока мы разрабатывали этот подход, мы столкнулись с некоторыми проблемами.

Данные датчика должны быть связаны с графиком. Сущность Plot находилась в модуле area-plot, а также в другом модуле постоянства. Мы предвидели сильно фрагментированную модель данных со всеми видами проблем целостности и производительности. Фактически, мы думаем, что эти проблемы будут больше, чем проблема «большого узла в середине» второго подхода, который был моделью общей области. Поскольку многие модули будут реализовывать бизнес-процессы, им потребуются другие модули для предоставления данных.

Какой бы вариант мы ни выбрали, переход на новую модель будет сложным. Мы реализовали второй подход, создав модуль модели, содержащий сущности основного домена и их отношения. Упрощенно, у нас есть «График», который может иметь ноль или более «SensorRuns», который может иметь ноль или более «SensorReadings». Модуль «датчик-круг-обрезка» содержит реализацию датчика для конкретного круга-обрезки. Он ничего не знает о заговорах или пробегах. Он хочет сохранить некоторые специфические атрибуты кругов на полях, которые отсутствуют в более общей сущности «SensorReading». Поэтому мы создаем сущность «CropcircleSensorReading» и подключаем ее к сущности «SensorReading» из модуля модели.

Файл «persistence.xml» в модуле sensor-cropcircle содержит только два объекта: «SensorReading» и «CropcircleSensorReading». Модуль area-plot импортирует графики из файла формы, сохраняя их в таблице «График», файл «persistence.xml» содержит только сущность «График». Модуль link-sensor-plot связывает данные датчика с графиками, создавая прогоны датчиков, файл «persistence.xml» содержит «Plot», «SensorRuns» и «SensorReadings».

Уровень обслуживания имеет аналогичную иерархию — абстрактную базовую службу в модуле модели с некоторыми функциями для запроса, хранения сущностей модели общего домена, со специальными службами в постоянных модулях, которые расширяют базовую службу. API предоставляет только доменные объекты, а не специфичные для реализации объекты, такие как «CropcircleSensorReading».

Решение об использовании платформы NetBeans

Несколько лет назад мы разрабатывали приложение для крупной европейской гавани. Одним из требований было, чтобы приложение было веб-ориентированным. Мы начали строить некоторые части необходимых компонентов в доказательство концепции. Вскоре мы обнаружили, что количество JavaScript, необходимое для реализации взаимодействия с пользователем, которое требуется клиенту, взрывает браузер. С множеством модулей, которые еще впереди, мы не могли создать гладкое, интерактивное веб-приложение.

Мы успешно оспорили веб-требования. Мы сузили выбор платформы с расширенными возможностями для клиентов NetBeans и Eclipse. Наша команда состояла как минимум из половины младших членов. Низкий уровень обучения IDE NetBeans в сочетании с использованием стандартного Swing в платформе NetBeans заставил нас выбрать NetBeans. После короткого периода наращивания мы достигли довольно высокой скорости развития.

Будучи как архитектором, так и разработчиком, стратегия на основе компонентов платформы NetBeans подходила как перчатка. Архитектурные проблемы могут быть решены и решены очень быстро, что не приведет к задержке разработки.
К сожалению, нам так и не удалось завершить это заявление по другим причинам.

После почти трехлетнего участия в другом проекте появилась новая возможность разработки для приложения Java-rich-client. С очень хорошим опытом работы с первым приложением на платформе NetBeans мы решили использовать его снова. Мы были приятно удивлены скачками прогресса, достигнутыми командой NetBeans в интеграции с Maven, которую мы решили использовать в качестве инструмента сборки.

Преимущества платформы NetBeans

Мне действительно нравятся структурированные / модульные приложения. Особенно, когда вещи становятся большими и сложными, структура необходима
для поддержания достойного уровня качества. Платформа NetBeans сама по себе не только структурирована и модульна, но и более или менее вынуждает вас так же структурировать собственное приложение.

Как технический архитектор, я отвечаю за качество и структуру кода. Структура платформы NetBeans направляет разработчиков в правильном направлении, упрощая мою работу. Если, например, разработчик спрашивает, как ему следует документировать свой API, я указываю ему один из API-интерфейсов NetBeans в качестве справочного. Многие преимущества вытекают из модульного дизайна платформы NetBeans. Поиск, слабая связь, общедоступные пакеты, загрузчики классов модулей и т. Д.

Активное сообщество помогает в решении проблем.

Еще одним преимуществом является поддержка платформы NetBeans для Maven. Я действительно начал любить и ценить Maven как инструмент для сборки в моем предыдущем проекте. Есть еще кое-что, что нужно улучшить, но основа крепкая.

Технические советы

Сделайте дизайн ваших модулей и придерживайтесь его. Это избавит вас от многих проблем. Каждый раз, когда я брал архитектурный ярлык из-за нехватки времени или по какой-либо причине, это вызывало неприятные последствия.

Мы создали шину событий в нашем первом приложении на платформе NetBeans. С тех пор мы использовали его в большинстве приложений, и это доказало свою ценность. Функция «Поиск» не всегда подходит для событий «запусти и забудь». Иногда вы просто хотите что-то кричать в забвении, не заботясь, если кто-то что-то с этим сделает. Наш автобус для мероприятий предоставляет это для нас. Я мог бы / должен написать отдельную статью об этом, потому что это немного выходит за рамки этого интервью.

Если вы хотите заглянуть в наш автобус для мероприятий, перейдите сюда и рассмотрите статью, ожидающую рассмотрения. 🙂

Планы на будущее

В настоящее время у нас есть только несколько «приложений» в нашем магазине. При поддержке общественных и коммерческих партий мы хотим превратить ее в полноценную «фермерскую IDE». Погодные сводки, налоговые декларации, магазины удобрений, автоматические тракторы без водителя … небо это предел.

Если кто-то заинтересован в проекте AgroSense или у него есть идея для связанного «приложения», посетите домашнюю страницу .

Вы могли бы даже заработать на этом деньги в будущем, если это понравится фермерам. И, наконец, не волнуйтесь, будьте счастливы и получайте удовольствие от создания приложений для богатых клиентов NetBeans!