Статьи

JXSE и Equinox Tutorial, часть 2

JXSE и Equinox Tutorial, часть 2

ПРИМЕЧАНИЕ. С января 2015 года вы можете интегрировать JXTA в OSGI через сайт обновлений . WIKI  В chaupal.org   дает подробные инструкции о том , как использовать новые связки 2.8.x JXSE для OSGI.Many из функции покрыта здесь реализуется по умолчанию.

Аннотация

В первом посте этой серии мы рассмотрели самый быстрый способ заставить JXSE 2.7x работать в Equinox и, с некоторыми соображениями, возможно, также и другие платформы OSGI. Подход направлен , чтобы получить ту же функциональность , как вы могли бы получить с помощью файла банки в обычной обстановке JAVA, но , как я показал, Equinox действительно имеет преимущество позволяет несколько экземпляров JXSE работать одновременно, что является большим преимуществом при разработке JXSE Приложения.

Во втором уроке мы расскажем о некоторых способах улучшения функциональности путем разрыва зависимости от версии Jetty 4.2x (которая только что выпустила версию 9.0!) И представим некоторые основные инструменты для визуализации свойств и функций JXSE. , Это еще больше улучшит цикл разработки приложений JXSE.

ПРИМЕЧАНИЕ. В этом руководстве будет использоваться модифицированный JXSE-файл jar, который в настоящее время тестируется редко. Если вы хотите разрабатывать в отказоустойчивой среде, я бы порекомендовал вам придерживаться подхода добавления jar 2.7x и org.mortbay.jetty 4.2x в структуру вашего плагина. Если вы более предприимчивы или, что еще лучше, хотите помочь улучшить инструменты, то этот пост для вас!

Обновление Jetty

Подход, который мы рассмотрели ранее, включает в себя включение сервера Jetty для каждого пакета JXSE, который вы хотите развернуть. Сервер Jetty используется для туннелирования HTTP и в основном запускает простой сервер HTTP с одним сервлетом. Если мы хотим оптимизировать этот подход при запуске нескольких проектов JXSE-пакетов, было бы логично предположить, что мы запускаем один экземпляр сервера, который регистрирует несколько сервлетов, что в основном является способом, которым Jetty работает в большинстве сред OSGI. В идеале мы бы использовали службу http для Equinox для регистрации наших сервлетов, но, поскольку каждый пакет JXSE должен работать на другом сетевом порту, регистрация сервлетов является более сложной задачей.

Следствием нарушения зависимости от jar org.mortbay.jetty 4.2x (т.е. удаления jar-файла из каталога lib и помещения его в отдельный пакет) является то, что код JXSE также необходимо изменить, и поэтому мы может также создать пакет JXSE 2.7x! Этот пакет будет клиентом для декларативного сервиса , предлагаемого плагином Jetty, который позволяет регистрировать конкретные сервлеты, которые использует JXSE. Необходимые пакеты можно найти в extended.zip , который предлагает функциональность, расширяющую базовый перенос приложений JXSE на Equinox. может быть включен в определение вашей цели:

ПРИМЕЧАНИЕ. Файл zip был изменен по состоянию на январь 2014 года, а некоторые имена пакетов были переименованы. Если вы загрузили предыдущую версию, часть вашего кода не будет компилироваться с новыми пакетами!


  1. Загрузите zip-файл и распакуйте его в том же корневом каталоге, что и другие целевые плагины (например, C: \ Projects \ Target \ Extended)

  2. В Eclipse IDE выберите «Окно» → « Настройки» → « Разработка плагинов» → « Целевая платформа» и выберите активную цель, которую мы собрали в предыдущей публикации.

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

    СОВЕТ: Расширение определения цели новыми каталогами может быть делом RSI. К счастью, в поле «Местоположение» хранятся предыдущие записи, поэтому, если вы выберете одну из них перед нажатием кнопки «Обзор», вы можете выиграть довольно много щелчков мышью.

Определение цели было расширено несколькими пакетами, три из которых важны для этой части руководства:

  1. net.jxse (2.7.x)

  2. org.mortbay.jetty (4.2.x)

  3. org.eclipse.jetty.jxse.bridge (1.xy)

Я пытаюсь следовать соглашению об использовании версии jar-файла, когда он конвертируется в OSGI, и из этого становится очевидным, что первые два пакета в основном являются исходными jar-файлами, которые были развернуты в первой части руководства. Единственное отличие состоит в том, что эти пакеты разделяют свои зависимости через декларативный сервис.

ПРИМЕЧАНИЕ. Внутренне необходимые изменения были выполнены с минимальным воздействием кода. Насколько мне известно, основная функциональность не должна быть затронута. Основные различия вступают в силу только тогда, когда одновременно развернуто несколько пакетов JXSE, что я считаю в любом случае новой функциональностью. Поэтому при разработке отказоустойчивых приложений эти два комплекта должны быть удобны в использовании, но, чтобы быть уверенным, внимательно следите за журналами HTTP!


Теперь мы можем изменить два проекта плагина JXSE, которые мы разработали в предыдущем посте, для работы с этими пакетами. Мы также будем использовать другой пример из книги Practical JXTA II, чтобы сделать вещи более интересными. Мы попытаемся соединить Edge_Anna с Rendezvous_Jack. Измените два проекта JXSE 2.7x Bundle, которые вы сделали в предыдущем уроке :

  1. Удалить папку lib и ссылки на lib/jxse-2.7.jar and lib/org.mortbay.jetty.jar in the bundle classpath settings.

  2. Solve the compiler errors by importing the necessary bundle dependencies in the 'imported packages' tab of the Manifest editor.

  3. Include the org.mortbay.jettybundle (not the bridge!)

Полученный файл Manifest.MF должен выглядеть примерно так:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Practical JXTA II: Anna the Edge Peer
Bundle-SymbolicName: net.practical.jxta.decoupled.anna
Bundle-Version: 1.0.0.v20130816
Bundle-Activator: net.practical.jxta.decoupled.anna.Activator
Bundle-Vendor: MyCompany
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
Import-Package: net.jxta,
net.jxta.document,
net.jxta.endpoint,
net.jxta.exception,
net.jxta.id,
net.jxta.peer,
net.jxta.peergroup,
net.jxta.platform,
net.jxta.rendezvous,
org.osgi.framework;version="1.7.0"


Теперь мы можем скопировать
Edge_Anna.java и Rendezvous_Jack.java из папки B_Exploring_Connectivity_Issues из примеров , которые описаны в Practical JXTA II, в качестве замены для предыдущих примеров. Наконец, нам нужно внести небольшую корректировку в Активаторы , чтобы обеспечить параллелизм:

import java.util.concurrent.Executors;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator, Runnable {

private static Activator activator;
private ExecutorService executor;

  static Activator getDefault() {
    return activator;
  }

  public void start(BundleContext bundleContext) throws Exception {
    activator = this;
    executor = Executors.newSingleThreadExecutor();
    executor.execute(this);
  }

  public void stop(BundleContext bundleContext) throws Exception {
    if( !executor.isShutdown() && !executor.isTerminated())
      executor.shutdown();
    Activator.context = null;
  }

  @Override
  public void run() {
    Edge_Anna.main(null);
  }
}

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

    ИНФОРМАЦИЯ: Сервер Jetty для JXTA найден!

И чуть позже:

    ИНФОРМАЦИЯ: Строка 679 net.jxta.impl.peergroup.GenericPeerGroup.loadModule ()
    Загруженный привилегированный модуль: эталонная реализация транспорта сообщений HTTP
    (net.jxta.impl.endpoint.servlethttp.ServletHttpTransport)

Как Rendezvous_Jack запускает транспорт HTTP. Если этого не происходит, то наиболее вероятной причиной является то, что пакет org.mortbay.jetty не запустился (введите «ss» в консоли Eclipse , чтобы узнать состояние пакетов). Вы также можете проверить, правильно ли запущены декларативные сервисы, которые создают соединение между двумя пакетами, набрав в консоли OSGI:

  1. 'посетители': это должно вернуть (по крайней мере)
    osgi> посетители
    net.jxse.petitioner.ServerStarterPetitioner
    org.mortbay.jetty.provider.ServerProvider

  2. 'matched': это должно вернуть:
    osgi> matched
    net.jxse.petitioner.ServerStarterPetitioner соответствует:
    org.mortbay.jetty.provider.ServerProvider

Пакеты используют облегченную оболочку вокруг стандартных декларативных сервисов OSGI, называемых защищенным брокером ( org.eclipselabs.osgi.ds.broker ), для установления соединения. Этот пакет также предоставляется целевым дополнением, которое было загружено. Одной из добавленных функций являются три консольные команды для проверки соединений (третья - «ожидание»). Первая команда перечисляет зарегистрированные (посреднические) службы, вторая - какие службы сопоставляются друг с другом. Выше вы можете видеть, что пакет net.jxse связан с пакетом org.mortbay.jetty. Если эти команды не распознаются, это означает, что плагин брокера еще не активирован.

Интеграция с Jetty 6 до Jetty 8 (включительно)

Если вы немного более предприимчивы, вы можете попробовать Jetty Bridge , который также был включен в дополнения к цели. Для этого пакета требуются пакеты org.eclipse.jetty с 6.0.0 до 8.9.9, которые часто поставляются с определенными дистрибутивами Eclipse. Просто отключите пакет org.mortbay.jetty и активируйте org.eclipse.jetty.jxse.bridge . (и Причал, конечно). Если все хорошо, вы должны увидеть то же поведение, что и раньше, но теперь можно использовать более свежие версии Jetty.

ПРИМЕЧАНИЕ. Пожалуйста, учтите, что я протестировал этот вариант только с Jetty 8, но не полностью. Источники доступны на eclipselabs, поэтому эксперт Jetty (знание JXTA вряд ли требуется) может значительно улучшить текущий код!

Включение инструментов JXSE для Eclipse

В предыдущих примерах, вероятно, было ясно, что всплывающие сообщения и сообщения журнала не будут очень полезны при одновременной разработке нескольких проектов JXSE Bundle. Хотя эта работа еще не завершена (и, вероятно, так будет всегда), была начата разработка инструментов JXSE, которые можно использовать в Eclipse IDE. Я надеюсь добавить больше постов к этому учебному пособию, когда функциональность станет доступной, но здесь мы можем начать с демонстрации того, что нужно сделать как минимум, чтобы сделать ваши проекты JXSE Bundle видимыми для инструментов.

Чтобы включить инструментарий Eclipse, необходима новая цель, которая заменяет равноденствие версией Eclipse (которая, конечно, включает версию Equinox). Поскольку у нас уже есть достаточный опыт управления целевыми определениями, я просто перечислю три каталога, которые необходимы для запуска и запуска

  1. Версия Eclipse. Вы можете скопировать установку Kepler в целевую среду (рекомендуется) или использовать параметр
    $ {eclipse-home} в качестве местоположения (самый быстрый)

  2. основные пакеты JXSE, которые были загружены для предыдущего поста

  3. Расширенные пакеты JXSE, которые были загружены для первой части этого урока

Далее нам нужно создать новое приложение Eclipse (FileNewPlugin Project). Выберите опцию, для которой «плагин предназначен для работы с» версией Eclipse, и (на второй вкладке) мы разработаем приложение Rich Client. Нажатие «Готово» сгенерирует Eclipse RCP. Мы включим одну перспективу в RCP, жестко закодировав ее в ApplicationWorkbenchAdvisor :

package org.{my-company}.jxse.ui;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

  private static final String PERSPECTIVE_ID = "org.eclipse.jxse.perspective";

  @Override
  public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
         IWorkbenchWindowConfigurer configurer) {
    return new ApplicationWorkbenchWindowAdvisor(configurer);
  }

  @Override
  public String getInitialWindowPerspectiveId() {
    return PERSPECTIVE_ID;
  } 
}

Затем удалите файл Tools.java из комплектов JXSE и переименуйте неисправный импорт в комплектах JXSE в «net.osgi.jxse.compatibility.Tools». Нам также необходимо внести некоторые изменения в код из Practical JXTA II:

  1. Заставьте класс, который запускает примеры, расширять net.osgi.jxse.compatibility.AbstractExampleContext

  2. Включить addModule (MyNetworkManager) после того, как он был создан;

ПРИМЕЧАНИЕ . Статический метод addModule регистрирует модули JXTA (NetworkManager, различные службы и т. Д.) В JP2PContainer, помещая их в экземпляр IJp2pComponent. Фактически, контейнер JP2P принимает любой объект; он в основном служит для создания древовидной структуры предоставленных модулей (объектов) с NetworkManager в качестве основного дочернего элемента. NetworkConfigurator также внутренне представлен как IJp2pComponent, но контекст службы уже учитывает это при регистрации NetworkManager. 

Наконец, для «Приложения Eclipse» необходима новая конфигурация запуска. Выберите опцию «Запустить приложение» на первой вкладке и выберите приложение, которое вы только что создали. Необходимые подключаемые модули рабочей области должны включать приложение и два проекта JXSE Bundle «Jack the Rendezvous» и «Anna the Edge». Добавьте «Обязательные комплекты» и убедитесь, что включены следующие комплекты:

  1. org.eclipse.equinox.console

  2. Три org.apache.felix.gogo расслоения

  3. org.eclipselabs.osgi.ds.broker

  4. org.mortbay.jetty или org.eclipse.jetty.jxse.bridge

  5. net.osgi.jxse.compatibility

  6. org.chaupal.jp2p.ui

  7. org.chaupal.jp2p.ui.jxta

Проверьте конфигурацию и при необходимости добавьте «Необходимые комплекты». Если проблем не обнаружено, вы можете запустить приложение. Если все прошло хорошо, вы должны увидеть, как запускаются два пакета JXSE, как они делали это раньше, но вместо несколько устаревших всплывающих окон из JAVA Swing должны появиться более яркие альтернативы из пакетов SWT Eclipse. Также базовое приложение Eclipse должно стать видимым с некоторыми представлениями, которые в настоящее время пусты. Более наблюдательные разработчики, вероятно, заметят

    ВНИМАНИЕ:
       Этот комплект не является действительным комплектом JXSE. Требуется каталог JP2P-INF.

Игнорируйте это предупреждение на данный момент. Это станет более важным в следующей части этой серии.

Мы почти на месте! Остановите конфигурацию запуска и внесите следующие изменения в проекты JXSE Bundle:

  1. Создайте новое определение компонента (Файл → Создать →…) и выберите в качестве родительской папки <your.bundle.name> / OSGI-INF и имя jxse.xml ( или другое имя по вашему выбору). Это создаст папку OSGI-INF в корневом каталоге ваших пакетов JXSE и добавит файл.

  2. Когда откроется редактор компонентов, заполните данные следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
    <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="<your.bundle.name>.service">
    <implementation class="<your.bundle.name>.service.OsgiComponent"/>
    <reference bind="setAttendeeService" cardinality="1..1" interface="org.eclipselabs.osgi.ds.broker.IAttendeeService" name="IAttendeeService" policy="static" unbind="unsetAttendeeService"/>
    </scr:component>

  3. После того как определение компонента завершено, требуемый OsgiComponent.java должен присутствовать в указанном пакете. Этот класс должен выглядеть следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
    <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="<your.bundle.name>.service">
    <implementation class="<your.bundle.name>.service.OsgiComponent"/>
    <reference bind="setAttendeeService" cardinality="1..1" interface="org.eclipselabs.osgi.ds.broker.IAttendeeService" name="IAttendeeService" policy="static" unbind="unsetAttendeeService"/>
    </scr:component>
  4. Включите в файл Manifest-MF следующую строку:

    Service-Component : OSGI-INF / jxse.xml

  5. OsgiComponent очень прост:
    package <your.bundle.name>;
    
      import net.jxta.platform.NetworkManager;  
      import net.osgi.jp2p.chaupal.core.Jp2pDSComponent;
      import <your.bundle.name>.Activator;
    
      public class OsgiComponent extends JxseDSComponent<NetworkManager> {
       
       public OsgiComponent() {
         super( Activator.getDefault());
       }
    }
  6. Измените Активатор следующим образом:

package <your.bundle.name>;

  import net.osgi.jp2p.chaupal.activator.AbstractJp2pBundleActivator;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class Activator extends AbstractJp2pBundleActivator{ private static Activator activator; static Activator getDefault() { return activator; } public void start(BundleContext bundleContext) throws Exception { activator = this; } public void stop(BundleContext bundleContext) throws Exception { activator = null; } @Override public IJp2pContainer<NetworkManager> createContainer(){ return new Edge_Anna(); } }


Как видите, Активатор стал намного проще, так как суперкласс, из которого он создан, выполняет большую часть работы. Все, что нужно сделать, это сообщить активатору, что IJp2pContainerтребуется, и об этом позаботятся. OsgiComponentИзвлекает контекст из Activatorи предлагает его в качестве декларативной службы.

Если изменения компилируются без проблем, вы можете запустить приложение, и если все прошло успешно, вы должны увидеть, что оба пакета JXSE становятся видимыми в навигаторе с левой стороны графического интерфейса. Нажав на них, вы увидите NetworkManager, NetworkConfigurator and the NetPeerGroup, пока их свойства отображаются в редакторе свойств.

ПРИМЕЧАНИЕ. В настоящее время не все функции работают безупречно (так как это проект инкубатора), но некоторые свойства можно установить без проблем. Однако я не уверен, как JXSE реагирует на их динамическое изменение, поэтому я рекомендую использовать PropertyViewer только для просмотра.

Обеспечение безопасности вашего комплекта JXSE

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

Вывод

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