Сегодня я хочу рассказать о JGroups. Это Java-библиотека для организации группового взаимодействия между различными процессами Java. Приложения, использующие JGroups могут:
Здесь я ограничусь начальной информацией и опишу создание простого группового чата на 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:
Возможно, необходимо настроить сетевой интерфейс для работы с мультикастом. В Linux, для этого необходимо добавить соответствующий роут:
Для того, чтобы создать канал необходимо создать объект класса JChannel, передав ему в конструктор параметры конфигурации. В примере в конфигурации я указываю адрес, который должен использоваться для канала. Полный список опций можно посмотреть в документации.
Теперь можно подключаться к кластеру вызовом JChannel#connect(). В качестве параметра в него передается имя группы, можете выбрать любое, которое Вам нравится.
Сообщения в JGroups представлены классом Message, который содержит адрес отправителя, адрес получателя и данные. Адреса представлены объектами класса Address, а данные — это любые сериализуемые объекты или просто массив байт. Например, чтобы создать сообщение для всей группой, содержащее строку можно написать:
Здесь первый параметр — получатель, затем — отправитель, а затем — содержимое.
Чтобы отправить сообщение необходимо вызвать метод JChannel#send и передать ему сообщение в качестве параметра. Например:
Теперь необходимо написать код, для обработки сообщений, приходящих приложению. Для этого необходимо вызвать метод JChannel#setReceiver, передав в качестве параметра объект, реализующий интерфейс Receiver. Например, чтобы просто выводить все полученные сообщения на печать достаточно написать следующий код:
Теперь можно собрать простейший чат. Он будет рассылать группе строки, принятые с консоли и печатать полученные строки на консоль. Пример кода:
Здесь я рассмотрел только создание канала и отправку сообщений группе. В стороне остались достаточно много моментов: адресация, сообщения конкретному процессу и, главное, управление группой. Желающие ознакомиться с ними могут заглянуть в документацию JGroups: http://jgroups.org/ug.html.
- Создавать и уничтожать группы
- Присоединяться к группам и покидать их
- Получать оповещения о новых членах групп
- Отправлять сообщения конкретному процессу или всем процессам группы
Здесь я ограничусь начальной информацией и опишу создание простого группового чата на 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
- <repository>
- <id>jboss</id>
- <name>jboss</name>
- <url>http://repository.jboss.com/maven2</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
и добавить в зависимости:Copy Source | Copy HTML
- <dependency>
- <groupId>jgroups</groupId>
- <artifactId>jgroups</artifactId>
- <version>2.6.13.GA</version>
- </dependency>
-
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </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
- channel.setReceiver( new ReceiverAdapter(){
-
- @Override
- public void receive( Message m ) {
- System.out.println( m.getObject() );
- }
-
- } );
Здесь, чтобы уменьшить объем кода, объект наследуется от класса ReceiverAdapter, который предоставляет пустые реализации различных методов интерфейса Receiver. Как видно из примера, для обработки сообщения используется метод receive, в который сообщение передается в качестве параметра.Простейший чат
Теперь можно собрать простейший чат. Он будет рассылать группе строки, принятые с консоли и печатать полученные строки на консоль. Пример кода:
Copy Source | Copy HTML
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- import org.jgroups.JChannel;
- import org.jgroups.Message;
- import org.jgroups.ReceiverAdapter;
-
- public class SimplestChat {
-
- public static void main( String[] args ) throws Exception {
- JChannel channel = new JChannel( "UDP(bind_addr=127.0.0.1)" );
- channel.setReceiver( new ReceiverAdapter() {
-
- @Override
- public void receive( Message m ) {
- System.out.println( m.getObject() );
- }
-
- } );
- channel.connect( "MyCluster" ); // Подключаемся к группе
-
- /**<br/> * Цикл обработки команд с консоли<br/> */
- BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
- while ( true ) {
-
- String line = in.readLine();
-
- if ( line.equalsIgnoreCase( "quit" ) || line.equalsIgnoreCase( "exit" ) ) {
- break;
- }
-
- channel.send( new Message( null, null, line ) );
- }
-
- channel.close(); // Отключаемся от группы по завершению работы
- }
-
- }
При запуске этот код должен выводить что-нибудь вроде:Nov 8, 2009 4:18:27 PM org.jgroups.JChannel init INFO: JGroups version: 2.6.13.GA
Что дальше?
Здесь я рассмотрел только создание канала и отправку сообщений группе. В стороне остались достаточно много моментов: адресация, сообщения конкретному процессу и, главное, управление группой. Желающие ознакомиться с ними могут заглянуть в документацию JGroups: http://jgroups.org/ug.html.