3. Обновление технологического стека

3.1. Переход к использованию WildFly

WildFly - это новый формат Java EE-сервера приложений, ранее известного как JBoss AS. В Synergy 4.1 используется WildFly 14 с Java 8.

../_images/image_0.png

С подробным описанием WildFly 14 можно ознакомиться в официальной документации. Здесь приведем краткое описание изменений, которые непосредственно влияют на процесс работы с Synergy:

  • WildFly более строго следит за стартом подсистем. В частности, если hostname машины, где запускается WildFly, не опознан, то не запустится подсистема веб-сервисов, и загрузка приложений остановится. Чтобы это исправить, нужно прописать имя хоста в файле /etc/hosts, например, с помощью такой команды:

    # echo "127.0.0.1    $(hostname)" >> /etc/hosts
    

    Вместо 127.0.0.1 можно указать внешний ip-адрес сервера.

  • Конфигурационный файл standalone-onesynergy.xml содержит большие изменения, связанные с изменением названий и состава подсистем сервера приложений. Если в вашем старом конфигурационном файле standalone-onesynergy.xml не имелось каких-либо собственных изменений (например, добавления очередей, источников данных и прочего), необходимо отвечать Да на запрос об изменении этого конфигурационного файла при обновлении.

    Подсказка

    Если у вас имеются собственные изменения, необходимо сделать резервную копию standalone-onesynergy.xml, заменить ваш конфигурационный файл на тот, что поставляется с пакетом (то есть, опять же, ответить Да на вопрос об изменении файла) и, внимательно изучив различия старой и новой конфигураций (например, используя diff или его варианты), произвести необходимые изменения в новой версии конфигурационного файла.

  • Состав пакетов arta-synergy-* значительно сокращен:

    • arta-synergy-jboss - пакет, содержащий сервер приложений WildFly
    • arta-synergy-asforms - описание форм Synergy
    • arta-synergy-deps-jackrabbit - адаптер для хранилища Jackrabbit; как и прежде, может быть заменен на arta-synergy-jcrmigrator или arta-synergy-jcr4c
    • arta-synergy-esb - объединенный пакет, содержащий шину событий Synergy и индексатор
    • arta-synergy-synergy - пакет с Synergy и всеми необходимыми библиотеками (которые ранее жили в пакете arta-synergy-deps*)
    • arta-synergy-utils - некоторые вспомогательные утилиты

3.1.1. Инструкция по исправлению ошибок, возникших после обновления

3.1.1.1. Восстановление работы внешних модулей

  1. В зависимостях на библиотеки

    • compile(group: 'com.google.guava', name: 'guava', version: '14.0.1', transitive: false)
    • compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.6.1', transitive: false)
    • compile ('org.jboss.spec:jboss-javaee-6.0:3.0.3.Final')
    • compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
    • compile "org.codehaus.jackson:jackson-core-asl:1.9.13"

    прописать новые версии:

    • compile(group: 'com.google.guava', name: 'guava', version: '18.0', transitive: false)
    • compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25', transitive: false)
    • compile ('org.jboss.spec:jboss-javaee-7.0:1.1.1.Final')
    • compile "org.codehaus.jackson:jackson-mapper-asl:1.9.2"
    • compile "org.codehaus.jackson:jackson-core-asl:1.9.2"

    Версии для asf-common и util-common прописать 4.1:

    • compile(group: 'kz.arta', name: 'asf-common', version: '4.1')
    • compile(group: 'kz.arta', name: 'util-common', version: '4.1')

2. Чтобы приложение деплоилось после деплоя Synergy.ear, необходимо добавить файл jboss-all.xml в WEB-INF с содержимым:

<jboss umlns="urn:jboss:1.0">
    <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
        <dependency name="Synergy.ear" />
    </jboss-deployment-dependencies>
</jboss>
  1. При вызове методов API Synergy в PostConstruct методах в WildFly может возникнуть ошибка:

    WFLYCTL0348: Timeout after [300] seconds waiting for service container stability. Operation will roll back. Step that first updated t
    he service container was 'add' at address '[
        ("core-service" => "management"),
        ("management-interface" => "native-interface")
    ]'
    

    Если ошибка будет воспроизводится на вашем стенде Synery, то в качестве обходного варианта решения предлагаем вынести обращения к методам API в таймер, который будет запускаться в PostConstruct методе с задержкой 2 минуты. Если вы найдете более элегантное решение, просим сообщить в команду Core Team.

  2. Если вы используете resteasy его необходимо прописать через providedCompile:

    providedCompile(group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.8.0.Final')
    providedCompile(group: 'org.jboss.resteasy', name: 'resteasy-multipart-provider', version: '3.8.0.Final')
    

3.1.1.2. Новый формат очередей

Wildfly интегрирован с Apache ActiveMQ Artemis, поэтому в случае наличия на стенде Synergy кастомных очередей необходимо поменять их формат (в файле /opt/synergy/jboss/standalone/configuration/standalone-onesynergy.xml).

Очереди теперь прописываются в разделе <subsystem xmlns="urn:jboss:domain:messaging-activemq:3.0"> в формате:

<jms-queue name="ItsmBlockingQueue" entries="queue/ItsmBlockingQueue java:jboss/queues/Integration/ItsmBlockingQueue" durable="true"/>

3.1.1.3. Изменения в скриптах интерпретатора

Скрипты, содержащие строки со splice, на Java8 отрабатывают некорректно:

Array.prototype.splice.call(arguments, 0);

Необходимо заменить такую строку на следующую:

var args = Array.prototype.slice.call(arguments);

Предположим, что скрипт интерпретатора содержал такой код:

getValue: function(){
    Array.prototype.splice.call(arguments, 0);
    args.push(__SERVER);
    return __CLIENT__.getValue.apply(null, args);
}

setValue: function(){
    Array.prototype.splice.call(arguments, 0);
    args.push(__SERVER);
    return __CLIENT__.setValue.apply(null, args);
}

Исправленный вариант этого кода выглядит так:

getValue: function(){
    var args = Array.prototype.slice.call(arguments);
    args.push(__SERVER);
    return __CLIENT__.getValue.apply(null, arguments);
}

setValue: function(){
    var args = Array.prototype.slice.call(arguments);
    args.push(__SERVER);
    return __CLIENT__.setValue.apply(null, args);
}

3.2. Обновление Lucene

До версии Synergy 4.0 включительно в качестве индексатора форм, файлов и документов использовался Lucene версии 3.6.2.

В версии Synergy 4.1 используемая версия индексатора была обновлена до 7.3.1. При этом актуальная версия Lucene может не поддерживать некоторые индексы, созданные в предыдущих версиях, и это не является ошибкой Synergy.

3.2.1. Утилита для обновления индексов

Пакет arta-synergy-utils содержит утилиту для апгрейда индексов Lucene до версии 7. Чтобы ее использовать, нужно:

  1. остановить jboss:

    # /etc/init.d/arta-synergy-jboss stop
    
  2. вызвать команду:

    # /opt/synergy/utils/lucene/upgrade-to-lucene-7.sh
    

    При необходимости можно передать пути к индексам в командной строке, например:

    # /opt/synergy/utils/lucene/upgrade-to-lucene-7.sh /some/index/path /some/other/path
    

В этом случае файл /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml игнорируется.

В случае успешного апгрейда индексов вывод команды будет таким:

Reading paths from /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml:
/var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/index
========================
Upgrade /var/lib/synergy/documentIndex to:
Lucene version 4.10.4... done.
Lucene version 5.5.0... done.
Lucene version 6.3.0... done.
Lucene version 7.3.1... done.
========================
Upgrade /var/lib/synergy/formIndex to:
Lucene version 4.10.4... done.
Lucene version 5.5.0... done.
Lucene version 6.3.0... done.
Lucene version 7.3.1... done.
========================
Upgrade /var/lib/synergy/index to:
Lucene version 4.10.4...done.
Lucene version 5.5.0... done.
Lucene version 6.3.0... done.
Lucene version 7.3.1... done.
========================
Upgrade to Lucene 7 went OK!

После выполнения утилиты необходимо снова запустить Synergy и выполнить индексацию документов, форм и файлов.

Внимание

Процедуру полной переиндексации документов, форм и файлов необходимо выполнять независимо от того, какой индексатор используется в Synergy - и для Lucene, и для Elasticsearch.

3.2.2. Возможные ошибки

Возможна ситуация, когда утилита не сможет обновить индексы:

Reading paths from /opt/synergy/jboss/standalone/configuration/arta/luceneConfiguration.xml:
/var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/index
========================
Upgrade /var/lib/synergy/documentIndex to:
Lucene version 4.10.4...Exception in thread "main" org.apache.lucene.index.IndexFormatTooNewException: Format version is not supported (resource: BufferedChecksumIndexInput(MMapIndexInput(path="/var/lib/synergy/documentIndex/segments_w"))): 8 (needs to be between 0 and 3)
    at org.apache.lucene.codecs.CodecUtil.checkHeaderNoMagic(CodecUtil.java:156)
    at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:348)
    at org.apache.lucene.index.SegmentInfos$1.doBody(SegmentInfos.java:462)
    at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:923)
    at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:769)
    at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:458)
    at org.apache.lucene.index.DirectoryReader.listCommits(DirectoryReader.java:277)
    at org.apache.lucene.index.IndexUpgrader.upgrade(IndexUpgrader.java:150)
    at org.apache.lucene.index.IndexUpgrader.main(IndexUpgrader.java:73)

В этом случае нужно:

  1. остановить jboss

  2. удалить индексы из папки /var/lib/synergy/:

    # rm -r /var/lib/synergy/documentIndex /var/lib/synergy/formIndex /var/lib/synergy/fileIndex /var/lib/synergy/index
    
  3. запустить jboss и выполнить индексирование файлов, форм и документов в Административном приложении

Внимание

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

3.3. Обновление Cassandra

В Synergy 4.1 была обновлен используемый пакет для хранилища Cassandra до версии 2.2. Со всеми нововведениями в этой версии вы можете ознакомиться по ссылке.

Одним из преимуществ новой версии Cassandra является возможность компрессии данных, которая не только обеспечивает экономию дискового пространства, но и увеличивает скорость чтения с диска на 25-35% (согласно официальному заявлению Datastax).

Сравнение экономии дискового пространства при использовании различных алгоритмов сжатия
Метод компрессии Процент сжатия
LZ4 12,54
Snappy 12,48
Deflate 33,84

3.3.1. Как включить компрессию

При использовании хранилища Cassandra с платформой Arta Synergy следует включать компрессию на таблицах jcr.properties и jcr_ss4c.ss4c, например, при выборе алгоритма сжатия DeflateCompressor команды будут выглядеть следующим образом:

cqlsh> ALTER TABLE jcr.properties WITH compression = {'sstable_compression': 'DeflateCompressor'};
cqlsh> ALTER TABLE jcr_ss4c.ss4c  WITH compression = {'sstable_compression': 'DeflateCompressor'};

Для отключения компрессии нужно использовать подобную команду:

cqlsh> ALTER TABLE jcr.properties WITH compression = {'sstable_compression': ''};

Способы включить/ отключить компрессию на таблицах БД показаны в соответствующей статье Datastax.

3.4. Обновление JasperReports

В новой версии Synergy была добавлена поддержка работы с системой для построения пользовательских отчетов TIBCO Jaspersoft Studio (на момент релиза актуальной является версии 6.6.0). Среди прочих изменений, внедренных TIBCO в этой версии, в применении к Synergy интересна возможность построения отчетов на основе данных JSON и XML.

Инструкция по работе с новой версией JasperReports приведена в Руководстве разработчика.