Skip to content
Dmitry Che edited this page Apr 4, 2016 · 4 revisions

Самый простой способ для разработки и сборки модуля на Java - это использовать Maven. Установите его, а в файле pom.xml вашего модуля пропишите нужные вам зависимости, название модуля и его версию. Например:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.aggregate</groupId>
    <artifactId>date-time</artifactId>
    <version>1.0.0</version>

    <distributionManagement>
        <repository>
            <id>bintray-aggregate</id>
            <url>https://api.bintray.com/maven/uzyovoys/aggregate/date-time/;publish=1</url>
        </repository>
    </distributionManagement>

    <repositories>
        <repository>
            <id>bintray-aggregate</id>
            <url>https://dl.bintray.com/uzyovoys/aggregate</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>com.aggregate</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-core</artifactId>
            <version>3.2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Обязательной является только зависимость vertx-core. Указывайте ее scope provided всегда. Если вам нужен и API Агрегата (только для функциональных модулей), то укажите зависимость от api (как в примере выше) и тоже укажите что она provided. Не забудьте в этом случае добавить репозиторий https://dl.bintray.com/uzyovoys/aggregate, так как API Агрегата пока нет в центральном репозитории Maven.

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

После этого вы можете собирать ваш модуль простой командой в консоли mvn clean install.

Как отлаживать модуль

Понятно, что во время разработки модуля может потребоваться отладка. Для этого запустите Агрегат с помощью одного из скриптов, в имени которого есть слово debug. Для Windows - start_debug.bat, для Mac OS и Linux - start_debug.sh. Этот скрипт запустит Java с открытым портом 5555 для подключения к нему отладчика.

В вашей IDE вы можете легко нему подключиться, чтобы отлаживать ваш код. Например в IntelliJ IDEA создайте новую конфигурацию запуска приложения типа "Remote" и укажите там подключение к порту 5555 на localhost.

После запуска вы можете увидеть в консоли, что ваша IDE подключилась к Агрегату и теперь можно ставить breakpoint и работать с дебагером.

Сборка во время разработки

Чтобы не проходить каждый раз процедуру копирования вашей сборки модуля в папку deploy, просто используйте команду mvn clean install и перезапускайте Агрегат. Он сразу подхватит последнюю версию вашего модуля и установит ее.

API

AbstractVerticle

Ваш главный класс должен расширять абстрактный класс io.vertx.core.AbstractVerticle из фреймворка Vertx.

Метод start

Главный файл модуля должен иметь метод start. Он вызывается фреймворком при старте модуля. Существует два вида этого метода - синхронный и асинхронный. Первый нужно использовать, если процедура инициализации модуля быстрая и не связана с трудоемкими операциями. Второй нужен в обратном случае. Вот примеры на языке Java.

Синхронный старт

@Override
public void start() throws Exception {
  vertx.eventBus().consumer("cmd.datetime.time", m -> {
    m.reply(getTime());
  });
}

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

Асинхронный старт

    @Override
    public void start(Future<Void> f) throws Exception {
        String accessKey = config().getString("accessKey");
        String secretKey = config().getString("secretKey");
        if (accessKey == null || accessKey.isEmpty() || secretKey == null || secretKey.isEmpty()) {
            f.fail("Provide your access and secret keys in config file");
            return;
        }

        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        client = new IvonaSpeechCloudClient(new StaticCredentialsProvider(credentials));
        client.setEndpoint(ENDPOINT);
        vertx.eventBus().consumer("tts.say", msg -> {
            ...
        });

        f.complete();
    }

Здесь происходит создание клиента для стороннего сервиса, что может занять время, поэтому используется асинхронный вид старта. В этом случае модуль обязан вызвать на объекте Future либо метод fail в случае ошибки, либо complete в случае удачного старта.

Конфигурация

Также можно получить конфигурацию модуля, который Агрегат предоставит ему при старте (это тот самый файл <имя модуля>.json в папке conf). Для этого можно вызывать метод config(), который вернет JSON объект конфигурации. А уже оттуда можно вытаскивать данные по известным модулю именам.

Вообще это можно делать в любом методе модуля, но только после того, как вызван метод start или в самом этом методе.

Остановка модуля

Если модуль останавливается Агрегатом (при выгрузке модуля или при остановке самого Агрегата), то будет вызван метод stop. Там можно освободить используемые ресурсы (если такие есть) и правильно завершить работу модуля.
Так же, как и для метода start, для данного метода существуют синхронная и асинхронная версии.

Russian Version (Русская версия)





IDE


English Version

Main Page

Modules

  • List of available modules

User Guide

  • Where to get

  • How to install

  • How to use

  • Setting up


Developer Guide

Aggregate Architecture

Events List

Command Line


How to Create a Module

  • Java
  • Javascript
  • Typescript
  • Groovy
  • Ruby

Functional Modules

  • Query grammar

  • Pattern syntax

  • Dynamic patterns

  • Standard patterns

Activation Modules

Speech Recognition Modules

Text-to-Speech Modules


IDEs

  • Developing in Eclipse
  • Developing in IntelliJ IDEA

Change Log

Clone this wiki locally