VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - CVIČENÍ Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage Část 11.
Program Aplikace Fotoalbum Práce s JMS Export fotografií do JMS fronty Import fotografií do další aplikace
Export a import fotografií Album JMS Provider (Glassfish – Open MQ) PhotoMan 1: výběr fotografií pro export 4:spuštění importu 5:příjem Exporter <<Stateless>> PhotoManager <<Application>> Queue 3: odeslání do fronty 2: dotaz do db 6:uložení fotografie DB Dir
Exporter EJB V modulu ejb vytvořte třídu beanu Exporter Tento bez-stavový bean má na starosti export vybraných fotografií do JMS fronty Metoda exportPhotos(from, to) vybere fotografie v daném datumovém rozmezí a vyexportuje je do fronty package cz.vse.javaee.album; import javax.annotation.Resource; import javax.annotation.PreDestroy; import javax.annotation.PostConstruct; import javax.ejb.EJBException; import javax.jms.*; import javax.ejb.Stateless; import javax.ejb.LocalBean; import javax.persistence.EntityManager; import java.util.Date; import javax.persistence.TypedQuery; import javax.persistence.PersistenceContext; import java.util.List; * k JMS frontě, kterou drží otevřenou až do okamžiku jeho likvidace (metoda destroy). * Tento bezstavový bean má na starosti export fotografií do JMS fronty. Při inicializaci vytvoří spojení /** */ public class Exporter { @LocalBean @Stateless @PersistenceContext private ConnectionFactory connectionFactory; @Resource(mappedName = "jms/exportQueueFactory") private EntityManager entityManager; private Queue queue; @Resource(mappedName = "jms/exportQueue") private Connection connection; @PostConstruct private void init() { } catch (JMSException e) { connection = connectionFactory.createConnection(); try { } throw new EJBException(e); private void destroy() { @PreDestroy connection.close(); throw new EJBException(); * @param to horní limit výběru - vyjma * @param from spodní limit výběru - včetně * Vybere fotografie v daném datumovém rozmezí a vyexportuje je do fronty. public void exportPhotos(Date from, Date to) { TypedQuery<Photo> query = entityManager.createQuery( "select p from Photo p where p.created >= :f and p.created < :t", query.setParameter("t", to); query.setParameter("f", from); Photo.class); List<Photo> resultList = query.getResultList(); MessageProducer producer = queueSession.createProducer(queue); Session queueSession = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); BytesMessage photoMessage = queueSession.createBytesMessage(); for (Photo photo : resultList) { photoMessage.setStringProperty("description", photo.getDescription()); photoMessage.setStringProperty("name", photo.getName()); photoMessage.writeBytes(photo.getImage()); photoMessage.setStringProperty("albumName", photo.getAlbum().getName()); photoMessage.setIntProperty("version", photo.getVersion()); photoMessage.setStringProperty("created", photo.getCreated().toString()); producer.send(photoMessage); destroy(); } catch (Exception e) {
Úprava entity Photo Zaveďte nový atribut created typu java.util.Date spolu s příslušnými gettery/settery Nezapomenout na @Temporal(TemporalType.TIMESTAMP) Atribut je nastaven na aktuální čas private Date created = new Date();
Nová akce exportPhotos V servletu AlbumServlet zaveďte novou akci exportPhotos spolu s metodou doExportPhotos(HttpServletRequest request, HttpServletResponse response) v poznámkách private void doExportPhotos(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fromParam = request.getParameter("from"); String toParam = request.getParameter("to"); try { getAlbumPageBean(request).exportPhotos(fromParam, toParam); } catch (ParseException e) { throw new ServletException(e); } request.getRequestDispatcher("upload.jsp").forward(request, response);
Úprava AlbumPageBean Akce exportPhotos je delegována z AlbumServlet kontroleru na AlbumPageBean, podobně jako ostatní akce. Zaveďte do AlbumPageBean nový atribut exporter typu Exporter Přidejte odpovídající argument do konstruktoru a použijte jej k inicializaci atributu exporter Přidejte metodu exportPhotos (v poznámkách) spolu se statickým atributem format Pozn.: AlbumPageBean svou povahou odpovídá vzoru BusinessDelegate private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); public void exportPhotos(String fromParam, String toParam) throws ParseException { Date fromDate = format.parse(fromParam); Date toDate = format.parse(toParam); exporter.exportPhotos(fromDate, toDate); }
Injektáž Exporter do AlbumServlet AlbumServlet vytváří instanci AlbumPageBean, která nyní potřebuje navíc odkaz na Exporter Vytvořte nový atribut, do kterého kontejner injektuje odkaz na Exporter EJB. Předejte hodnotu tohoto atributu do volání konstruktoru AlbumPageBean
Stránka export.jsp Vytvořte JSP stránku export.jsp, která slouží ke spuštění exportu (viz poznámky). Do stránky upload.jsp přidejte link na export.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Export fotek</title></head> <body> <h3>Export fotek</h3> <form action="album" method="post"> <input type="hidden" name="action" value="exportPhotos"/> <label for="from">Od (yyyy-MM-dd):</label><br> <input id="from" type="text" name="from"/><br> <label for="to">Do (yyyy-MM-dd):</label><br> <input id="to" type="text" name="to"/><br> <input type="submit" value="Exportuj"> </form> </body> </html>
Konfigurace JMS V administrátorské konzoli vyberte složku Resources/JMS Resources/Connection Factories Vytvořte novou továrnu připojení Pool Name – jms/exportQueueFactory Resource Type – javax.jms.QueueConnectionFactory Vyberte složku Resources/JMS Resources/Destination Resources Vytvořte novou frontu JNDI Name - jms/exportQueue Physical Destination Name – exportQueue Resource Type – javax.jms.Queue
Build & Deploy
Sledování Open MQ Open MQ je možné spravovat z příkazové řádky Adresář: glassfishv3/mq/bin Příkaz: imqcmd list dst vypíše stav všech JMS destinací
Aplikace PhotoManager Jednoduchá aplikace, která se přihlásí k exportní frontě pro výběr. Všechny zprávy interpretuje jako fotografie, které ukládá do adresáře specifikovaného jako první argument metody main(). Aplikaci si stáhněte z http://java.vse.cz/wiki/uploads/4it447/4it447- cviceni11-photoManager.zip
Ladění Java EE aplikace Je třeba spustit server v ladícím režimu Menu Configuration/JVM Settings v konzoli GF Nastavte příznak Debug na Enabled Server je třeba restartovat V IDE je třeba vytvořit vzdálený ladící profil V NetBeans menu Debug/Attach Debugger Debugger = Java Debugger (JPDA) Connector = Socket Attach Host = localhost Port = 9009 (nastavuje se na serveru v Debug Options) Pozor na firewall v OS. Debug port je někdy nutné explicitně povolit
Domácí úkol Aplikace Fotoalbum bude umožňovat export vybraných jednotlivých fotografií prostřednictvím JMS fronty. K výběru použijte checkboxy, které doposud slouží k označení fotografií ke smazání Pro účely tohoto úkolu rozšiřte funkcionalitu třídy Exporter