IT Research Department @BKAP 2015 Page 1 / 27Lab 06 - 07 Introduction to Messaging Interceptors and Dependency Injection Mục tiêu - Tạo và gửi một message đến một JMS Resource - Clien
Trang 1IT Research Department @BKAP 2015 Page 1 / 27
Lab 06 - 07 Introduction to Messaging Interceptors and Dependency Injection
Mục tiêu
- Tạo và gửi một message đến một JMS Resource
- Client nhận một message được lưu trữ trên JMS Resource
- Tạo và cấu hình Interceptors
- Thực thi các Interceptors
Phần I Bài tập step by step
Bài 4.1 Xây dựng một JSF Web Application đặt lịch họp và thông báo đến tất cả các thành viên lịch họp đó
Step 1: Tạo một JSF Web Application tên là MeetingMessenger
File New Java Web WebApplication
Name and Location: Project Name MeetingMessenger
Frameworks: JavaServer Faces
Step 2: Tạo một JMS Resource
RC MeetingMessenger New GlassFish JMS Resource
Trang 3IT Research Department @BKAP 2015 Page 3 / 27
Sau khi hoàn thành, một JMS Resource được tạo và thông tin của nó được lưu trên file glassfish-resources.xml
<admin-object-resource enabled="true" jndi-name="jms/meetingMessQueue" object-type="user"
res-adapter="jmsra" res-type="javax.jms.Queue">
Trang 4 RC MeetingMessenger New GlassFish JMS Resource
Trang 5IT Research Department @BKAP 2015 Page 5 / 27
Sau khi hoàn thành, Một JMS Resource Connection Factory được tạo và thông tin của
nó được lưu trong file glassfish-resource.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN"
"http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<admin-object-resource enabled="true" jndi-name="jms/meetingMessQueue" object-type="user"
res-adapter="jmsra" res-type="javax.jms.Queue">
max-wait-time-</resources>
Step 4: Tạo một JSF Managed Bean đặt tên JMSProducerBean trong package bean
RC Source Packages New JavaServer Faces JSF Managed Bean
Trang 6 Viết code JMSProducerBean.java
package bean;
Trang 7IT Research Department @BKAP 2015 Page 7 / 27
public class JMSProducerBean {
//Them meetingMessQueue reference den jms/meetingMessQueue
@Resource(mappedName = "jms/meetingMessQueue")
private Queue meetingMessQueue;
//Khai bao message truyen thong bao
private String message;
public JMSProducerBean() {
}
//Getter and setter
public String getMessage() {
//phuong thuc send message
public void send() throws NamingException, JMSException {
InitialContext initContext = new InitialContext();
FacesContext facesContext = FacesContext.getCurrentInstance();
ConnectionFactory factory = (ConnectionFactory) initContext.lookup("jms/meetingMessQueueFactory");
Destination destination = (Destination) initContext.lookup("jms/meetingMessQueue");
initContext.close();
//Tao cac doi tuong JMS
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer sender = session.createProducer(destination);
//Gui message
TextMessage msg = session.createTextMessage(message);
Trang 8<h:outputLabel value="Message: "/>
<h:inputText id="message" value="#{jMSProducerBean.message}" size="30"/>
<h:commandButton id="Send" value="Send Message" action="#{jMSProducerBean.send()}"/>
<h:messages globalOnly="true"/>
</h:form>
</h:body>
</html>
Step 6: Build and Run Application
Step 7: Kiểm tra JMS Resource lưu trữ trên Server
Services Servers GlassFish Server View Domain Admin Console
Common Tasks Server (Admin Server) JMS Physical Destinations
Trang 9IT Research Department @BKAP 2015 Page 9 / 27
Trang 10Step 8: Tạo EJBModule để nhận các message từ JMS Resource
Trang 11IT Research Department @BKAP 2015 Page 11 / 27
Step 9: Tạo Message-Driver Been
ClientMessage New Other EnterpriseBeans Message-Driver Bean
Trang 13IT Research Department @BKAP 2015 Page 13 / 27
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/meetingMessQueue") })
public class JMSConsumerBean implements MessageListener {
public JMSConsumerBean() {
}
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
try {
System.out.println("Received message: " + msg.getText());
} catch (JMSException ex) {
Logger.getLogger(JMSConsumerBean.class.getName()).log(Level SEVERE, null, ex);
Trang 14Bài 4.2 Xây dựng ứng dụng chat gồm các room chat để user có thể join vào các room chat và tính
số lượng user join vào mỗi phòng
Step 1: Tạo một ứng dụng Enterprise với tên là ChatApplication
File New Project Java EE Enterprise Application
Name: ChatApplication
Server and Settings
Server: GlassFish Server
Create EJB Module
Create Web Application Module
Sau khi hoàn thành:
Step 2: Tạo lớp java ChatRoomStats trong package data để quản lý phòng chat, số người
trong phòng chat, thời gian tham gia phòng chat
ChatApplication-ejb New Other Java Java Class
Trang 15IT Research Department @BKAP 2015 Page 15 / 27
public class ChatRoomStats {
//Khai bao ten phong chat la bien chatRoom
private String chatRoom;
//Khai bao so luong nguowi trong phong chat la bien personCount
private int personCount;
//Khai bao so thoi gian tham gia phong chat la bien totalTime
private long totalTime;
//Tao constructor
public ChatRoomStats(String chatRoom) {
this.chatRoom = chatRoom;
}
//Getter va Setter cac bien
public String getChatRoom() {
//Phuong thuc tang so luong nguoi tham gia phong chat khi co nguoi join vao
public void increment() {
this.personCount += 1;
}
//Phuong thuc tinh so thoi gian tham gia
public void increaseTotalTime(long time) {
this.totalTime += time;
Trang 16}
}
Step 3: Tạo lớp java ApplicationStats trong package datatrên cơ sở Singleton pattern để
khởi tạo đối tượng ChatRoomStats
ChatApplication-ejb New Other Java Java Class
public class ApplicationStats {
//Khai bao bien Singleton
private static ApplicationStats instance;
//Khai bao danh sach ChatRoomStats
private static List<ChatRoomStats> chatRoomStats = new ArrayList<>();
//Constructor
public ApplicationStats() {
}
//Phuong thuc khoi tao instance
public static ApplicationStats getInstance() {
//Phuong thuc tinh so nguoi chat
public void inscrementCount(String chatRoom){
for (ChatRoomStats room : chatRoomStats) {
//Phuong thuc tinh so nguoi chat trong 1 thoi gian
public void recordTime(String chatRoom, long time){
for (ChatRoomStats room : chatRoomStats) {
if (room.getChatRoom().equals(chatRoom)) {
room.increaseTotalTime(time);
break;
Trang 17IT Research Department @BKAP 2015 Page 17 / 27
}
}
}
//Phuong thuc get List Chat Room
public List<ChatRoomStats> getChatRoomStats(){
Trang 18@LocalBean
public class ChatRoomBean {
public void joinChatRoom(String chatRoom) {
Trang 19IT Research Department @BKAP 2015 Page 19 / 27
public class ChatRoomInterceptor {
//Phuong thuc xu ly truoc khi khoi tao session bean
@PostConstruct
public void initialiseChatRoom(InvocationContext context) {
System.out.println("PostConstruct - initialising Chat Rooms");
List<ChatRoomStats> list = ApplicationStats.getInstance().getChatRoomStats();
//Them cac phong chat vao list
list.add(new ChatRoomStats(("Business")));
list.add(new ChatRoomStats("Family"));
}
//Phuong thuc xu ly truong khi huy session bean
@PreDestroy
public void preDestroy(InvocationContext context) {
System.out.println("PreDestroy - Clearing Chat Room");
ApplicationStats.getInstance().getChatRoomStats().clear();
}
}
Step 6: Tạo lớp java có tên HitCounterInterceptor trong package interceptorpack để đếm
số người join vào room chat
Trang 20public class HitCounterInterceptor {
//Phuong thuc thuc thi truoc va sau khi xu ly nghiep vu
@AroundInvoke
public Object incrementHitCount(InvocationContext context) throws Exception{
System.out.println("HitCounterInterceptor - Start");
//lay Chat Room
String chatRoom = (String) context.getParameters()[0];
//Tang so luong nguoi chat trong room
ApplicationStats.getInstance().inscrementCount(chatRoom);
Object result = context.proceed();
System.out.println("HitCounterInterceptor - Terminate");
Trang 21IT Research Department @BKAP 2015 Page 21 / 27
public class TimerInterceptor {
public Object recordPerfTime(InvocationContext context) throws Exception {
System.out.println("PerformanceMethodInterceptor - Start");
String chatRoom = (String) context.getParameters()[0];
long startTime = System.currentTimeMillis();
Object result = context.proceed();
long endTime = System.currentTimeMillis();
ApplicationStats.getInstance().recordTime(chatRoom, endTime - startTime);
System.out.println("PerformanceMethodInterceptor - Terminate");
Trang 22System.out.println("New person joined the Chat Room " + chatRoom); }
Step 9: Tạo servlet tên là ChatServlet trong package servlet thực thi interceptor
ChatApplication-war New Other Web Servlet
Trang 23IT Research Department @BKAP 2015 Page 23 / 27
Trang 24public class ChatServlet extends HttpServlet {
//goi Enterprice session bean
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
//Lay ten phong chat tu request
String chatRoom = request.getParameter("ChatRoom");
try (PrintWriter out = response.getWriter()) {
//Kiem tra neu trang duoc load hoac join vao room
if (chatRoom != null && !chatRoom.isEmpty()) {
//Thuc thi phuong thuc interceptor
//Form hien thi cho user
out.println("<form name='ChatStats' action='ChatServlet' method='POST'>");
out.println("Chat Room: <select name='ChatRoom'>");
out.println("<option value='Business'>Business</option>");
out.println("<option value='Family'>Family</option>");
Trang 25IT Research Department @BKAP 2015 Page 25 / 27
out.println("</select>");
out.println("<input type='submit' value='Join'/>");
out.println("<br/><hr>");
out.println("<h2>Chat Statistics</h2>");
//Lay list ChatRoomStats
List<ChatRoomStats> stats = chatRoomBean.getChatRoomStats();
for (ChatRoomStats room : stats) {
out.println("Chat Room - " + room.getChatRoom());
out.println("<ul><li>Number of people - " + room.getPersonCount() + "</li>");
out.println("<li> Total time taken (in mill sec) - " + room.getTotalTime());
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
public String getServletInfo() {
return "Short description";
}// </editor-fold>
Trang 26}
Ứng dụng sau khi hoàn thành
Step 10: Build and Run Application
Trang 27IT Research Department @BKAP 2015 Page 27 / 27