Содержание
- 2. Технология RMI Как правило, приложения RMI состоят из двух различных программ: сервера и клиента. Программа-сервер создаёт
- 3. Распределённые объектные приложения должны осуществлять следующее: Нахождение удалённых объектов. Приложения могут использовать различные механизмы получения ссылок
- 4. На рисунке показана структура RMI приложения
- 5. Сервер вызывает реестр для того, чтобы связать имя с удалённым объектом. Клиент ищет удалённый объект по
- 6. 2. Реализация удалённых объектов. Удалённые объекты должны реализовать один или несколько удалённых интерфейсов. Класс удалённого объекта
- 7. 3. Реализация клиентов. Клиенты, использующие удалённые объекты, могут быть реализованы в любой момент после того, как
- 8. 2. Реализация удалённых объектов. import java.rmi.*; import java.rmi.server.*; /* все удалённые объекты должны расширять UnicastRemoteObject, который
- 9. Регистрация RMI объекта в реестре import java.rmi.*; import java.net.*; public class AddServer{ public static void main
- 10. 3. Реализация клиентов. import java.rmi.*; public class AddClient{ public static void main (String[] args){ try{ //
- 11. Рассмотрим использование rmi. Компилируем все файлы >javac AddServerIntf.java >javac AddServerImpl.java >javac AddServer.java >javac AddClient.java 2.Генерируем заглушки
- 12. Enterprise JavaBeans Архитектура технологии EJB Чаще всего системы строятся следующим образом. Есть клиентское приложение, которое соединяется
- 14. Такой подход имеет свои плюсы и минусы. В плюс идет относительно простая архитектура системы и относительно
- 15. Существует другой подход построения информационных систем. Система разделяется на три уровня. Каждый уровень имеет свои обязанности
- 17. Такой подход тоже имеет свои плюсы и минусы. В плюс идет: разделение системы на уровни, позволяющее
- 18. Продвигается 5 уровневая архитектура на основе EJB:
- 19. Основное в EJB это сервер приложений. Клиентские приложения будут общаться с ним через RMI или CORBA.
- 20. Сервер приложений имеет вид:
- 21. JNDI (Java Naming Directory Interface) - эта служба позволяет клиентскими приложениям находить на сервере приложений EJB
- 22. Security Service - сервис безопасности. Так как сервер приложений предоставляет удаленный доступ к EJB компонентам, то
- 23. Контейнер Контейнер предоставляет среду, в которой могут функционировать компоненты EJB. Функции контейнера: Разбор XML-описания компонента EJB
- 24. Контейнер имеет вид:
- 25. Компонентная модель Компоненты EJB имеют два внешних описания (интерфейса). Через них, собственно, клиент и взаимодействует с
- 26. Home-интерфейс является точкой входа в компонент. Другими словами любое начало взаимодействия с компонентами происходит через Home-интерфейсы.
- 27. Рассмотрим стандартный сценарий взаимодействия клиента с компонентами EJB.
- 28. 1. Клиент ищет Home-интерфейс нужного ему компонента по его имени через сервис имен JNDI (клиенту возвращается
- 29. Home-интерфейс Таким образом вся работа с компонентами начинается с обращения к Home-интерфейсу. Каждый тип компонент должен
- 30. В этом интерфейсе необходимо определить методы двух типов. Это фабричные методы create и поисковые find. Фабричные
- 31. Поисковые методы позволяют найти уже созданные компоненты на стороне сервера. Поисковые методы применимы только к компонентам,
- 32. Remote-интерфейс После того, как компонент был создан или найден через его Home-интерфейс и получена ссылка на
- 34. Стандартом, конечно, являются get/set-методы, считывающие и устанавливающие состояния параметров EJB-компонентов. Можно определить любые методы в Remote-интерфейсе.
- 36. ctx - ссылка на объект, которая позволяет компоненту получать служебную информацию о пользовательских транзакциях и данные
- 37. ejbCreate - методы которые реализует create методы из Home-интерфейса. Например, для сущностных бинов в нем реализуют
- 38. Дерево имен JNDI Каждому компоненту EJB сопоставляется имя, которое публикуется на дереве имен JNDI. И клиентское
- 39. Самым первый способ получения объектной ссылки выглядит так: запускается компонент на стороне сервера и полученная объектная
- 40. Схематически это выглядит следующим образом:
- 41. Сессионные бины Сессионный бин по функциональности очень похож на обычный класс, от которого можно порождать объекты
- 43. Сессионные бины бывают двух видов: Stateless and Stateful. Другими словами бины могут не помнить свое состояние
- 44. Сессионный бин помнящий свое состояние Бывает ситуации, когда необходимо, что бы бин помнил свое состояния между
- 46. Жизненный цикл в Stateful сессионного бина имеет вид:
- 47. Идея заложенная в сущностные бины следующая. Необходимо хранить информацию в реляционных таблицах и обеспечить к ним
- 49. Здесь показан пример бина, который обслуживает таблицу всего с двумя столбцами PK и title. Также присутствуют
- 50. Жизненный цикл сущностных бинов Жизненный цикл (ЖЦ) сущностных бинов похож на сессионный, но несколько сложнее:
- 51. Рассмотрим пример. Разработаем сеансовый компонент без состояния (Stateless Session Bean), который в ответ на запрос будет
- 52. Домашний интерфейс Теперь определим домашний интерфейс (Home Interface) в файле greetHome.java. import javax.ejb.*; import java.rmi.*; public
- 53. Класс компонента import javax.ejb.*; import java.rmi.*; import javax.naming.*; public class greetBean implements SessionBean { public String
- 54. Клиентское приложение import java.net.*; import javax.ejb.*; import javax.rmi.*; import java.rmi.*; import javax.naming.*; import java.util.*; import java.io.*;
- 55. props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(Context.PROVIDER_URL, "localhost:1099"); props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); Context ctx=new InitialContext(props); greetHome home = (greetHome)ctx.lookup("greetJndi"); greetRemote remote=home.create(); String
- 56. Компиляция и развертывание Развернем данное приложение с использованием сервера приложений JBoss 3.2. Прежде всего необходимо создать
- 57. Дескриптор ejb-jar.xml описывает само приложение ejb и имеет вид: Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb- jar_2_0.dtd"> greetBean greetHome
- 58. В этом дескрипторе развертывания имеются следующие элементы: - корневой элемент. В нем обязательно должен быть один
- 59. - полное имя класса удаленного интерфейса. - полное имя класса компонента. Этот класс реализует прикладные методы
- 60. Теперь рассмотрим непосредственно установку и компиляцию: Скачать архив JBoss 3.2 и развернуть (установка осуществляется простым копированием),
- 61. 4. Скомпилировать файлы greetRemote.java и greetHome.java, greetBean.java: >javac –cp .;c:\jboss-3.2.8.SP1\client\jboss-j2ee.jar *.java 5. Создать jar архив: >jar
- 62. В случае использование JBoss 6 и ejb 3, код бина поменяется. Интерфейс бина имеет вид Greet.java
- 63. Локальный интерфейс greetHome.java будет иметь вид: import javax.ejb.Local; @Local public interface greetHome extends Greet { }
- 64. Файл ejb-jar.xml имеет вид: xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd” version="3.0"> JBoss Stateless Session Bean Tutorial JBoss Stateless
- 65. Файл jboss.xml: xs:schemaLocation="http://www.jboss.org/j2ee/schema jboss_5_0.xsd" version="5.0"> Greet greetRemote greetHome
- 66. Клиент будет иметь вид: import javax.ejb.*; import javax.naming.*; import java.util.*; import java.io.*; public class Main{ public
- 67. InitialContext ctx=new InitialContext(props); Class clazz = greetRemote.class; Greet home = clazz.cast(ctx.lookup("greetRemote")); String a="Heloooo"; String s =
- 68. JMS JMS является еще одной технологией создания распределенных приложений, основанных на модели обмена сообщениями. JMS (Java
- 69. Модель обмена сообщениями (и JMS ) удобно использовать в том случае, если распределенное приложение обладает следующими
- 70. Архитектура JMS выглядит следующим образом
- 71. прикладные программы Java, использующие JMS, называются клиентами JMS (JMS client ); система обработки сообщений, управляющая маршрутизацией
- 72. JMS предоставляет два подхода к передаче сообщений. Первый называется "издание-подписка" ( publish an subscribe ) Этот
- 73. Второй подход называется "точка-точка" ( point to point ) и служит для реализации обмена сообщениями между
- 74. Модель передачи сообщений "точка-точка" предоставляет возможность клиентам JMS посылать и принимать сообщения (как синхронно, так и
- 75. Модель взаимодействия "издание-подписка" При использовании модели взаимодействия "издание-подписка" один клиент (поставщик) может посылать сообщения многим клиентам
- 76. Модель передачи сообщений "издание-подписка", по существу, представляет собой модель сервера, инициирующего соединение и "проталкивающего" информацию на
- 77. Использование JMS технологии. Любой компонент, использующий JMS, прежде всего должен создать соединение с JMS -провайдером -
- 78. Рассмотрим модель взаимодействия “точка-точка” на базе JMS провайдера ActiveMQ. import javax.jms.*; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public
- 79. public static void main(String[] args) throws JMSException { //создаем JMS соединение с сервером ConnectionFactory connectionFactory =
- 80. //задаем имя очереди Destination destination = session.createQueue(subject); //Для отправки сообщения используется MessageProducer MessageProducer producer = session.createProducer(destination);
- 81. //отправляем сообшение producer.send(message); //закрываем соединение connection.close(); } } Рассмотрим процедуру получения сообщения public class Consumer {
- 82. session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(subject); //Создаем объект MessageConsumer для приема сообщений MessageConsumer
- 83. if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; System.out.println(“Received message “+ textMessage.getText() ); }
- 84. JMS API определяет несколько типов сообщений: BytesMessage предназначен для передачи потока байт, который система никак не
- 85. Рассмотрим другой пример использования интерфейса MessageListener. public class Myclass implements MessageListener{ public static void main(String[] args)
- 86. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(“Queue1”); MessageConsumer consumer = session.createConsumer(destination); //Привязываем слушатель к
- 87. //Данный метод вызывается, когда в очереди Queue1 появляется сообщение public void onMessage(Message message){ String messagerecv; try{
- 88. Рассмотрим модель взаимодействия "издание-подписка“. Прежде всего рассмотрим класс издателя: public class Publisher { public static void
- 89. //Создаем соединение с JMS сервером TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup( "ConnectionFactory"); TopicConnection conn = factory.createTopicConnection(); conn.start(); //Создаем
- 90. //Создаем издателя TopicPublisher topicPublisher = session.createPublisher(mytopic); //константа NON_PERSISTENT означает, что сообщения не должны логироваться topicPublisher.setDeliveryMode( DeliveryMode.NON_PERSISTENT);
- 91. //Записываем сообщение в тему topicPublisher.publish(message); session.close(); conn.close(); } catch(NamingException e){ e.printStackTrace(); } catch(JMSException e){ e.printStackTrace(); }
- 92. Рассмотрим класс подписчика import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.Properties; public class Subscriber
- 93. //свойства можно вынести в файл jndi.properties, путь к файлу следует указать в переменной окружения CLASSPATH Properties
- 94. //Создаем объект - слушатель Subscriber asyncSubscriber = new Subscriber(); //Создаем соединение TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup( "ConnectionFactory");
- 95. //Ищем тему “MyTopic” Topic mytopic = (Topic)ctx.lookup("MyTopic"); //Создаем сессию TopicSession session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); //Создаем подписчика
- 96. //Метод вызывается при появлении сообщения в теме. public void onMessage(Message message){ TextMessage msg = (TextMessage)message; try
- 98. Скачать презентацию