Взаимодействие Java-приложений с JGroups

    Сегодня я хочу рассказать о JGroups. Это Java-библиотека для организации группового взаимодействия между различными процессами Java. Приложения, использующие JGroups могут:
    • Создавать и уничтожать группы
    • Присоединяться к группам и покидать их
    • Получать оповещения о новых членах групп
    • Отправлять сообщения конкретному процессу или всем процессам группы
    Библиотека достаточно широко используется, в частности в сервере приложений JBoss, в кэше OSCache и в Grid-платформе Infinispan.

    Здесь я ограничусь начальной информацией и опишу создание простого группового чата на Java.

    Начало работы


    Итак, для начала надо скачать JGroups. Сделать это можно здесь: http://sourceforge.net/projects/javagroups/files/. При написании этой статьи я использовал версию 2.6.13.GA. Также, для работы требуется Apache Commons Logging, или что-то его заменяющее (например, jcl-over-slf4j). Скачать можно здесь: http://commons.apache.org/downloads/download_logging.cgi.

    Если же Вы используете Maven, то можно добавить репозиторий JBoss:

    Copy Source | Copy HTML
    1. <repository>
    2.   <id>jboss</id>
    3.   <name>jboss</name>
    4.   <url>http://repository.jboss.com/maven2</url>
    5.   <snapshots>
    6.     <enabled>false</enabled>
    7.   </snapshots>
    8. </repository>
    и добавить в зависимости:

    Copy Source | Copy HTML
    1. <dependency>
    2.   <groupId>jgroups</groupId>
    3.   <artifactId>jgroups</artifactId>
    4.   <version>2.6.13.GA</version>
    5. </dependency>
    6.  
    7. <dependency>
    8.   <groupId>commons-logging</groupId>
    9.   <artifactId>commons-logging</artifactId>
    10.   <version>1.1.1</version>
    11. </dependency>

    Возможно, необходимо настроить сетевой интерфейс для работы с мультикастом. В Linux, для этого необходимо добавить соответствующий роут:

    route add -net 224.0.0.0 netmask 240.0.0.0 dev lo


    Иницализация


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

    JChannel channel = new JChannel( "UDP(bind_addr=127.0.0.1)" );

    Теперь можно подключаться к кластеру вызовом JChannel#connect(). В качестве параметра в него передается имя группы, можете выбрать любое, которое Вам нравится.

    channel.connect( "MyCluster" );

    Отправка сообщений


    Сообщения в JGroups представлены классом Message, который содержит адрес отправителя, адрес получателя и данные. Адреса представлены объектами класса Address, а данные — это любые сериализуемые объекты или просто массив байт. Например, чтобы создать сообщение для всей группой, содержащее строку можно написать:

    new Message( null, null, "Some content" )

    Здесь первый параметр — получатель, затем — отправитель, а затем — содержимое.

    Чтобы отправить сообщение необходимо вызвать метод JChannel#send и передать ему сообщение в качестве параметра. Например:

    channel.send( new Message( null, null, "Some content" ) )


    Обработка сообщений


    Теперь необходимо написать код, для обработки сообщений, приходящих приложению. Для этого необходимо вызвать метод JChannel#setReceiver, передав в качестве параметра объект, реализующий интерфейс Receiver. Например, чтобы просто выводить все полученные сообщения на печать достаточно написать следующий код:

    Copy Source | Copy HTML
    1. channel.setReceiver( new ReceiverAdapter(){
    2.  
    3.     @Override
    4.     public void receive( Message m ) {
    5.         System.out.println( m.getObject() );
    6.     }
    7.  
    8. } );
    Здесь, чтобы уменьшить объем кода, объект наследуется от класса ReceiverAdapter, который предоставляет пустые реализации различных методов интерфейса Receiver. Как видно из примера, для обработки сообщения используется метод receive, в который сообщение передается в качестве параметра.

    Простейший чат


    Теперь можно собрать простейший чат. Он будет рассылать группе строки, принятые с консоли и печатать полученные строки на консоль. Пример кода:

    Copy Source | Copy HTML
    1. import java.io.BufferedReader;
    2. import java.io.InputStreamReader;
    3.  
    4. import org.jgroups.JChannel;
    5. import org.jgroups.Message;
    6. import org.jgroups.ReceiverAdapter;
    7.  
    8. public class SimplestChat {
    9.  
    10.     public static void main( String[] args ) throws Exception {
    11.         JChannel channel = new JChannel( "UDP(bind_addr=127.0.0.1)" );
    12.         channel.setReceiver( new ReceiverAdapter() {
    13.  
    14.             @Override
    15.             public void receive( Message m ) {
    16.                 System.out.println( m.getObject() );
    17.             }
    18.  
    19.         } );
    20.         channel.connect( "MyCluster" ); // Подключаемся к группе
    21.  
    22.         /**<br/>         * Цикл обработки команд с консоли<br/>         */
    23.         BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
    24.         while ( true ) {
    25.  
    26.             String line = in.readLine();
    27.  
    28.             if ( line.equalsIgnoreCase( "quit" ) || line.equalsIgnoreCase( "exit" ) ) {
    29.                 break;
    30.             }
    31.  
    32.             channel.send( new Message( null, null, line ) );
    33.         }
    34.  
    35.         channel.close(); // Отключаемся от группы по завершению работы
    36.     }
    37.  
    38. }
    При запуске этот код должен выводить что-нибудь вроде:

      Nov 8, 2009 4:18:27 PM org.jgroups.JChannel init
      INFO: JGroups version: 2.6.13.GA
    

    Что дальше?


    Здесь я рассмотрел только создание канала и отправку сообщений группе. В стороне остались достаточно много моментов: адресация, сообщения конкретному процессу и, главное, управление группой. Желающие ознакомиться с ними могут заглянуть в документацию JGroups: http://jgroups.org/ug.html.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 2

      0
      спасибо…
        0
        спасибо! попробуем.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое