Spring Remoting
Spring framework предоставляет обширные возможности по созданию распределенных приложений. Он не только помогает создавать удаленные службы, но и упрощает доступ к ним. На данный момент в с помощью фреймворка можно организовывать удаленный доступ с помощью большого количества технологий — Caucho’s Hessian и Burlap, собственная реализация удаленного доступа через HTTP, RMI и т.д. Под катом краткий обзор возможностей фреймворка Spring для создания распределенных приложений с помощью RMI.
Вернемся к примеру, начатому в прошлой статье.
Был рассмотрен интерфейс Action, представляющий математическую операцию и две его реализации ActionAdd и ActionMultiply:
И интерфейс ICalculator с реализацией Calculator:
Объекты помещались в IoC контейнер spring:
И из контейнера извлекался уже созданный объект:
Теперь принято решение наше приложение сделать распределенным – один компьютер не справляется с большой вычислительной нагрузкой. Java предоставляет для таких случаев RMI — Remote Method Invocation, программный интерфейс вызова удаленных методов, с помощью которого не так сложно это сделать. Но используя Spring Remoting все получается более чем просто.
Для создания RMI сервера все, чт�� нам нужно, это объявить в контейнере специальный bean – RMI Service:
Стартуем сервер нашего распределенного приложения:
Считывая XML файл, Spring сам сделает все необходимое. Запускаем.
Сервер готов.
Теперь нужно сделать клиента. Создадим класс ClientCalculator, представляющий собой обертку для калькулятора:
Теперь для клиентского приложения создаем свой IoC XML контейнер:
Для создания и использования удаленных объектов используется RmiProxeFactoryBean, который возвращает необходимый интерфейс. И передает его только что созданной обертке clientCalculator.
Создаем класс клиента и проверяем:
Все, готово. Мы получили распределенное приложение.
Исходник:
http://narod.ru/disk/8319633001/springrmi.tar.gz.html
Используемые источники:
http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html
Кроме RMI, в Spring Remoting так же есть поддержка и других сервисов. Для дальнейшего чтения рекомендую обратиться к указанной выше ссылке.
Spring framework предоставляет обширные возможности по созданию распределенных приложений. Он не только помогает создавать удаленные службы, но и упрощает доступ к ним. На данный момент в с помощью фреймворка можно организовывать удаленный доступ с помощью большого количества технологий — Caucho’s Hessian и Burlap, собственная реализация удаленного доступа через HTTP, RMI и т.д. Под катом краткий обзор возможностей фреймворка Spring для создания распределенных приложений с помощью RMI.
Spring Remoting
Вернемся к примеру, начатому в прошлой статье.
Был рассмотрен интерфейс Action, представляющий математическую операцию и две его реализации ActionAdd и ActionMultiply:
public interface Action { long performAction(long op1, long op2); String getName(); } public class ActionAdd implements Action { @Override public long performAction(long op1, long op2) { return op1 + op2; } @Override public String getName() { return " + "; } } public class ActionMultiply implements Action { @Override public long performAction(long op1, long op2) { return op1 * op2; } @Override public String getName() { return " * "; } }
И интерфейс ICalculator с реализацией Calculator:
public interface ICalculator { public void setAction(Action act); public String calc(String[] args); } public class Calculator implements ICalculator { private Action action; @Override public void setAction(Action action) { this.action = action; } @Override public String calc(String[] args) { long op1 = Long.parseLong(args[0]); long op2 = Long.parseLong(args[1]); return op1 + action.getName() + op2 + " = " + action.performAction(op1, op2); } }
Объекты помещались в IoC контейнер spring:
<beans> <bean id="multiply" class="springtest.operations.ActionMultiply" /> <bean id="add" class="springtest.operations.ActionAdd" /> <bean id="calculator" class="springtest.calculator.Calculator"> <property name="action" ref="add" /> </bean> </beans>
И из контейнера извлекался уже созданный объект:
ICalculator calc = (ICalculator) factory.getBean("сalculator"); System.out.print(calc.calc(new String[] {"30", "60"}));
Распределение.
Теперь принято решение наше приложение сделать распределенным – один компьютер не справляется с большой вычислительной нагрузкой. Java предоставляет для таких случаев RMI — Remote Method Invocation, программный интерфейс вызова удаленных методов, с помощью которого не так сложно это сделать. Но используя Spring Remoting все получается более чем просто.
Для создания RMI сервера все, чт�� нам нужно, это объявить в контейнере специальный bean – RMI Service:
<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="serviceName" value="Calculator"/> <property name="service" ref="calculator"/> <property name="serviceInterface" value="springtest.calculator.ICalculator"/> <property name="registryPort" value="1199"/> </bean>
Стартуем сервер нашего распределенного приложения:
public class ActionServer { public static void main(String[] args) { new ClassPathXmlApplicationContext("xml-beans.xml"); } }
Считывая XML файл, Spring сам сделает все необходимое. Запускаем.
Mar 24, 2011 5:14:24 PM org.springframework.remoting.rmi.RmiServiceExporter getRegistry INFO: Looking for RMI registry at port '1199' Mar 24, 2011 5:14:24 PM org.springframework.remoting.rmi.RmiServiceExporter sourcepare INFO: Binding service 'Calculator' to RMI registry: RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[127.0.1.1:1199](remote),objID:[0:0:0, 0]]]]
Сервер готов.
Теперь нужно сделать клиента. Создадим класс ClientCalculator, представляющий собой обертку для калькулятора:
public class ClientCalculator { private ICalculator calculator; public void setCalculator(ICalculator calculator) { this.calculator = calculator; } public ICalculator getCalculator() { return calculator; } }
Теперь для клиентского приложения создаем свой IoC XML контейнер:
<beans> <bean id="clientCalculator" class="springrmi.client.ClientCalculator"> <property name="calculator" ref="remoteCalculator"/> </bean> <bean id="remoteCalculator" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl" value="rmi://localhost:1199/Calculator"/> <property name="serviceInterface" value="springtest.calculator.ICalculator"/> </bean> </beans>
Для создания и использования удаленных объектов используется RmiProxeFactoryBean, который возвращает необходимый интерфейс. И передает его только что созданной обертке clientCalculator.
Создаем класс клиента и проверяем:
public class Client { public static void main(String[] args) { ApplicationContext factory = new ClassPathXmlApplicationContext("springrmi/client/client-beans.xml"); ClientCalculator calc = (ClientCalculator) factory.getBean("clientCalculator"); System.out.print(calc.getCalculator().calc(new String[] {"30", "60"})); } }
30 + 60 = 90
Все, готово. Мы получили распределенное приложение.
Исходник:
http://narod.ru/disk/8319633001/springrmi.tar.gz.html
Используемые источники:
http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html
Кроме RMI, в Spring Remoting так же есть поддержка и других сервисов. Для дальнейшего чтения рекомендую обратиться к указанной выше ссылке.
