Komponenty sterowane komunikatami



Podobne dokumenty
Stanowe komponenty sesyjne

Enterprise JavaBeans

Usługa TimerService

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Java Enterprise Edition

Java wybrane technologie

Wprowadzenie do Enterprise JavaBeans 2.0

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

1. Podstawowe usługi bezpieczeństwa. 2. Użytkownicy i role. przydzielanie uprawnie ń metodom, role komponentów, korzystanie i konfiguracja

1. Model ACID. 2. Deklaratywne zarządzanie transakcjami, atrybuty transakcji. 3. Propagacja transakcji. transakcje rozproszone, propagacja kontekstu

Rola EJB na platformie Java EE. Enterprise JavaBeans (EJB)

Transakcje w systemach Java Enterprise Korzystanie z systemów kolejkowania w serwerach aplikacji

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Java wybrane technologie

Enterprise Java Beans Narzędzia i Aplikacje Java EE

Aplikacje internetowe i rozproszone - laboratorium

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

Enterprise JavaBeans (EJB)

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Message Oriented Middleware

Message Oriented Middleware

Kolejkowanie wiadomości Standard MQ (JMS)

Systemy Rozproszone - Ćwiczenie 6

Programowanie obiektowe

Platforma J2EE i EJB. Oprogramowanie systemów równoległych i rozproszonych Wykład 9. Rola EJB na platformie J2EE. Dr inż. Tomasz Olas olas@icis.pcz.

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

SOAP. Autor: Piotr Sobczak

Aplikacje biznesowe Wykład dla studentów Informatyki Stosowanej

Aplikacja wielowątkowa prosty komunikator

Enterprise JavaBean 3.0

Przykłady interfejsu TCP i UDP w Javie

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Programowanie obiektowe

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Aplikacje RMI

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Dostęp do komponentów EJB przez usługi Web Services

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Remote Method Invocation 17 listopada 2010

JAVA I BAZY DANYCH. MATERIAŁY:

Wzorce logiki dziedziny

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie komponentowe 5

Podstawowe informacje o technologii Java EE 7

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

"Biznesowe" wzorce projektowe

Zaawansowane aplikacje WWW - laboratorium

Aplikacja wielow tkowa prosty komunikator

Aplikacje RMI Lab4

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Aplikacje w środowisku Java

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Wykład 7: Pakiety i Interfejsy

mgr inż. Michał Paluch

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Java programowanie w sieci. java.net RMI

Wywoływanie metod zdalnych

Programowanie rozproszone w języku Java

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie w języku Java

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Tworzenie i wykorzystanie usług

Dokumentacja do API Javy.

Budowa komponentów Enterprise JavaBeans

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Wywoływanie metod zdalnych

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

EJB 3.0 & JBoss Seam. 25 kwietnia 2007 Jacek Gerbszt 1

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

1 Wprowadzenie do J2EE

namespace HostedReceiver { public class Receiver: IConfigureThisEndpoint, AsA_Server {

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie obiektowe

Programowanie obiektowe

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

JAX-RS czyli REST w Javie. Adam Kędziora

Transkrypt:

Komponenty sterowane komunikatami 1. Usługa JMS asynchroniczność, model przesyłania komunikatów, 2. Przykład wysyłanie wiadomości, odbieranie wiadomości, komponent sterowany komunikatami 3. Komponenty MDB cykl życia, wiązanie komunikatów. 1

Usługa JMS Specyfkacja JEE zawiera obsługę komunikatów JMS (Java Messaging Service). Za implementację usługi odpowiedzialny jest producent kontenera EJB. W technologii EJB usługa JMS może być wykorzystywana przez wszystkie typy komponentów. Komunikaty mogą być odbierane (konsumowane) przez aplikacje Javy lub przez komponenty sterowane komunikatami. 2

Asynchroniczność Przesyłanie komunikatów jest asynchroniczne, co oznacza, że klient JMS nie musi wstrzymywać działania do czasu otrzymania odpowiedzi na wysłany przezeń komunikat. Komunikat jest wysyłany do kolejki lub tematu i może zostać odebrany przez jednego lub wielu odbiorców. Ze względu na brak ścisłego związania nadawcy i odbiorcy, propagacja komunikatu nie zawiera kontekstów bezpieczeństwa i transakcji, niemniej wysyłanie komunikatu może następować w ramach transakcji rozproszonej. 3

Modele przesyłania komunikatów publikacja subskrypcja (1:N) subskrybent temat subskrybent subskrybent nadawca potencjalny odbiorca kolejka potencjalny odbiorca punkt - punkt (1:1) potencjalny odbiorca 4

Przykład struktura systemu klient serwer (usługi wiadomości i kontener EJB) JmsClient_ Reservation Producer queue/titan-reservationqueue Reservation Processor Bean JmsClient_ Ticket Consumer queue/titan-ticketqueue 5

Wysyłanie wiadomości package com.titan.clients; import javax.jms.*; import javax.naming.*; import java.util.*; import com.titan.processpayment.*; import com.titan.access.dataaccess; public class JmsClient_ReservationProducer { public static void main(string[] args) throws Exception { Properties p = new Properties(); p.load(jmsclient_reservationproducer.class.getresourceasstream("jndi.properties")); System.getProperties().putAll(p); 6

Wysyłanie wiadomości Integer cruiseid = new Integer(args[0]); int count = new Integer(args[1]).intValue(); Context jndicontext = getinitialcontext(); DataAccess access = (DataAccess) jndicontext.lookup("dataaccessbean/remote"); access.initializedb(); try { access.makepaymentdbtable(); catch (Exception ignored) { ConnectionFactory factory = (ConnectionFactory) jndicontext.lookup("connectionfactory"); Queue reservationqueue = (Queue) jndicontext.lookup("queue/titan-reservationqueue"); Queue ticketqueue = (Queue) jndicontext.lookup("queue/titan-ticketqueue"); Connection connect = factory.createconnection(); Session session = connect.createsession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer sender = session. createproducer(reservationqueue); 7

Wysyłanie wiadomości for (int i = 0; i < count; i++) { MapMessage message = session.createmapmessage(); // Used in ReservationProcessor // to send Tickets back out message.setjmsreplyto(ticketqueue); message.setstringproperty("messageformat", "Version 3.4"); message.setint("cruiseid", cruiseid); // either Customer 1 or 2, all we've got in database message.setint("customerid", i % 2 + 1); message.setint("cabinid", i % 5 + 1); // cabiny 100-109 message.setdouble("price", (double) 1000 + i); 8

Wysyłanie wiadomości // the card expires in about 30 days Date expdate = new Date(System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000L); message.setstring("creditcardnum", "5549861006051975"); message.setlong("creditcardexpdate", expdate.gettime()); message.setstring("creditcardtype", CreditCardDO.MASTER_CARD); System.out.println("Sending reservation message #" + i); sender.send(message); connect.close(); public static Context getinitialcontext() throws javax.naming.namingexception { return new InitialContext(); 9

Interfejs MessageListener Odbieranie komunikatów z reguły jest wykonywane przez obiekty implementujące interfejs javax.jmx.messagelistener: package javax.jms; public interface MessageListener { public void onmessage(message message); 10

Odbieranie wiadomości package com.titan.clients; import java.util.properties; import javax.jms.* import javax.naming.* import com.titan.travelagent.ticketdo; public class JmsClient_TicketConsumer implements MessageListener { public static void main(string[] args) throws Exception { Properties p = new Properties(); p.load(jmsclient_ticketconsumer.class.getresourceasstream("jndi.properties")); System.getProperties().putAll(p); new JmsClient_TicketConsumer(); while (true) { Thread.sleep(10000); 11

Odbieranie wiadomości public JmsClient_TicketConsumer() throws Exception { Context jndicontext = getinitialcontext(); ConnectionFactory factory = (ConnectionFactory) jndicontext.lookup("connectionfactory"); Queue ticketqueue = (Queue) jndicontext.lookup("queue/titan-ticketqueue"); Connection connect = factory.createconnection(); Session session = connect.createsession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer receiver = session. createconsumer(ticketqueue); receiver.setmessagelistener(this); System.out.println("Listening for messages..."); connect.start(); 12

Odbieranie wiadomości public void onmessage(message message) { try { ObjectMessage objmsg = (ObjectMessage) message; TicketDO ticket = (TicketDO) objmsg.getobject(); System.out.println("********************************"); System.out.println(ticket); System.out.println("********************************"); catch (JMSException displayed) { displayed.printstacktrace(); public static Context getinitialcontext() throws javax.naming.namingexception { return new InitialContext(); 13

Komponent sterowany komunikatami package com.titan.reservationprocessor; import com.titan.domain.*; import com.titan.processpayment.*; import com.titan.travelagent.*; import java.util.date; import javax.annotation.*; import javax.ejb.*; import javax.jms.*; import javax.persistence.*; import javax.naming.*; @MessageDriven(activationConfig={ @ActivationConfigProperty(propertyName="destinationType", propertyvalue="javax.jms.queue"), @ActivationConfigProperty(propertyName="destination", propertyvalue="queue/titan-reservationqueue")) 14

Adnotacja @ActivationConfgProperty @MessageDriven(activationConfig={ @ActivationConfigProperty( propertyname="destinationtype", propertyvalue="javax.jms.queue"), @ActivationConfigProperty( propertyname="messageselector", propertyvalue="messageformat = 'Version 3.4'"), @ActivationConfigProperty( propertyname="acknowledgemode", propertyvalue="auto-acknowledge")) messageselector fltr komunikatów, Message message = session.createmapmessage( ); message.setstringproperty("messageformat","version 3.4");... sender.send(message); acknowledgemode tryb potwierdzania otrzymania komunikatu, subscriptiondurability trwałość subskrypcji, destinationtype model wiadomości. 15

Komponent sterowany komunikatami public class ReservationProcessorBean implements javax.jms.messagelistener { @PersistenceContext(unitName= "titan") private EntityManager em; @EJB private ProcessPaymentLocal process; @Resource(mappedName="java:/JmsXA") private ConnectionFactory connectionfactory; public void onmessage(message message) { System.out.println("Received Message"); try { MapMessage reservationmsg = (MapMessage)message; int customerpk = reservationmsg.getint("customerid"); int cruisepk = reservationmsg.getint("cruiseid"); int cabinpk = reservationmsg.getint("cabinid"); double price = reservationmsg.getdouble("price"); 16

Komponent sterowany komunikatami // odczyt danych karty kredytowej Date expirationdate = new Date(reservationMsg.getLong("CreditCardExpDate")); String cardnumber = reservationmsg.getstring("creditcardnum"); String cardtype = reservationmsg.getstring("creditcardtype"); CreditCardDO card = new CreditCardDO(cardNumber, expirationdate, cardtype); Customer customer = em.find(customer.class, customerpk); Cruise cruise = em.find(cruise.class, cruisepk); Cabin cabin = em.find(cabin.class, cabinpk); Reservation reservation = new Reservation(customer, cruise, cabin, price, new Date()); em.persist(reservation); process.bycredit(customer, card, price); TicketDO ticket = new TicketDO(customer, cruise, cabin, price); deliverticket(reservationmsg, ticket); catch(exception e) { throw new EJBException(e); 17

Komponent sterowany komunikatami public void deliverticket (MapMessage reservationmsg, TicketDO ticket) throws JMSException, NamingException{ Queue queue = (Queue)reservationMsg.getJMSReplyTo(); // Queue queue = (Queue) //new InitialContext().lookup ("queue/titan-ticketqueue"); Connection connect = connectionfactory.createconnection(); Session session = connect.createsession(true,0); MessageProducer sender = session.createproducer(queue); ObjectMessage message = session.createobjectmessage(); message.setobject(ticket); sender.send(message); connect.close(); 18

Cykl życia komponentu sterowanego komunikatami Class.newInstance() @PostConstruct Nie istnieje @PreDestroy W puli gotowych komponentów Metoda biznesowa 19

Wiązanie komunikatów Komunikaty mogą być kierowane do konkretnego komponentu w celu dalszej obsługi EJB TravelAgent MDB TicketDistribution Inne systemy Specyfkacja EJB nie defniuje konkretnej adnotacji służącej do wiązania komunikatów. W tym celu należy skorzystać z deskryptora wdrożenia. 20

Wiązanie komunikatów <ejb-jar> <enterprise-beans> <session> <ejb-name>com.titan.travelagent.travelagentbean</ejb-name> <message-destination-ref> <message-destination-ref-name> jms/tickettopic </message-destination-ref-name> <message-destination-type> javax.jms.topic </message-destination-type> <message-destination-usage>produces</message-destination-usage> <message-destination-link>distributor</message-destination-link> <injection-target> <injection-target-class>javax.jms.topic</injection-target-class> <injection-target-name>topic</injection-target-name> </injection-target> </message-destination-ref> </session> 21

Wiązanie komunikatów <message-driven> <ejb-name>ticketdistributorejb</ejb-name> <message-destination-link>distributor</message-destination-link> </message-driven> </enterprise-beans> <assembly-descriptor> <message-destination> <message-destination-name>distributor</message-destination-name> </message-destination> </assembly-descriptor> </ejb-jar> 22

Podsumowanie Asynchroniczne przesyłanie komunikatów stanowi uzupełnienie luki wytworzonej przez synchroniczne działanie takich usług jak RMI, JAXP- RPC, czy też komponentów sesyjnych. Należy jednak pamiętać, że JMS nie jest jedynym, dostępnym mechanizmem wymiany komunikatów. 23