พัฒนา Java EE 6 ด้วย Maven ตอนที่ 2

ในตอนที่แล้วยังเขียนไม่จบเลยต้องมีตอนสอง เอาแค่ตัวอย่างเบาๆ ไม่ได้ลงลึกอะไร แค่ overview ซึ่งถ้าลงระดับ API อาจจะมีอะไรเด็ดกว่านี้ก็ได้ อันนั้นก็ไปศึกษาต่อเองหล่ะกัน

CDI

ชื่อเต็มคือ Contexts and Dependency Injection ใครเคยใช้ Spring Framework คงคุ้นเคยกันดี ผมให้คำนิยามมันสั้นๆ ว่า เป็นการ new object โดยให้ Java ทำให้ ความสามารถเจ๋งๆ ของ CDI มีเยอะครับ ยังรอให้เราค้นหาอยู่ แต่ตอนนี้ผมขอแค่ให้มัน Inject ได้ก็พอหล่ะ

  1. สร้างไฟล์ชื่อ beans.xml ข้างในไฟล์ไม่ต้องมีอะไร แล้วเก็บไว้ในโฟลเดอร์ WEB-INF อันนี้บังคับว่าต้องมี แต่เราไม่ได้ใช้ แม้แต่ผู้สร้าง Apache Tomee ก็ยังบอกว่าสร้างๆ ไปเหอะ
    ถ้าไม่เชื่อให้ลองข้ามไฟล์นี้แล้วทำขั้นตอนต่อไปจนรันก็จะพบ Error

    javax.enterprise.inject.UnsatisfiedResolutionException: Api type [com.magicalcyber.jupiter.pojo.HelloPojo] is not found with the qualifiers

  2. สร้าง POJO มาหนึ่งคลาสหน้าตาธรรมดาๆ มีแค่เมธอดที่ส่งค่า hello กลับดังนี้

    package com.magicalcyber.jupiter.pojo;
    
    public class HelloPojo {
    	public String hello(){
    		return "Hello POJO!";
    	}
    }
    
  3. แก้ไข HelloServlet เจ้าเดิมของเราให้เรียกใช้ Inject ดังนี้

    package com.magicalcyber.jupiter.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.magicalcyber.jupiter.ejb.HelloBean;
    import com.magicalcyber.jupiter.pojo.HelloPojo;
    
    @WebServlet("/hello")
    public class HelloWorldServlet extends HttpServlet {
    
    	@javax.ejb.EJB
    	private HelloBean helloBean;
    
    	@javax.inject.Inject
    	private HelloPojo helloPojo;
    
    	@Override
        protected void doGet(HttpServletRequest req, HttpServletResponse res)
                throws IOException, ServletException {
        	res.setContentType( "text/html; charset=UTF-8" );
            res.getWriter().write("<h2>Hello Servlet!</h2>");
            res.getWriter().write("<h2>"+helloBean.hello()+"</h2>");
            res.getWriter().write("<h2>"+helloPojo.hello()+"</h2>");
        }
    }
    
  4. สั่ง mvn clean package เพื่อความชัวร์ แล้วตามด้วย mvn tomee:run แล้วเข้าหน้า Servlet ก็จะพบข้อความใหม่หน้าตาดังนี้
    cdi

Timer Service

มันคือ Quartz Scheduler ดีๆ นี่เองครับ หาก start tomee จะเห็นเลยว่าใช้ Quartz เป็นตัว Scheduler เราสามารถตั้งเวลาให้ EJB ได้ว่า จะให้เมธอดใหนทำงานในเวลาที่ต้องการได้

  1. ผมต้องการใช้แสดงข้อความใน console ผ่าน slf4j-log4j จึงจำเป็นต้องสร้าง log4j.properties ไว้ในโฟลเดอร์ resources หน้าตาประมาณนี้
    # Direct log messages to stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
     
    # Root logger option
    log4j.rootLogger=INFO, stdout
    
  2. สร้าง EJB หน้าตาประมาณนี้

    package com.magicalcyber.jupiter.ejb;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @javax.ejb.Singleton
    public class HelloTimerBean{
    
    	private final Logger log = LoggerFactory.getLogger(HelloTimerBean.class);
    
    	@javax.ejb.Schedule(minute = "*/1", hour = "*")
    	public void helloSchedule(){
    		log.info("Hello Timer");
    	}
    }
    

    สั้นๆ คือหากต้องการให้เมธอดใหนทำงานก็ให้เพิ่ม Annotation Schedule พร้อมกับระบุเวลาทำงานที่ต้องการ

  3. เมื่อ run tomee ก็รอซักพัก ก็จะพบข้อความที่แสดงทุกๆ หนึ่งนาที
    timer service

ส่งท้าย

เอาพอหอมปากหอมคอสำหรับ ตัว JavaEE 6 ยังมีอะไรให้เล่นอีกหลายอย่าง ดูจาก http://en.wikipedia.org/wiki/Java_EE_version_history ได้ครับ

ตอนนี้ Spring Framework ไม่ได้ lightweight เหมือนเมื่อก่อน
และ Java EE ไม่ได้ heavyweight เหมือนเมื่อก่อนเช่นกัน

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s