Spring Roo 1.2

December 22nd, 2011 No comments

Spring Roo 1.2 ออกมาได้สักพักมีการเปลี่ยนแปลงเกิดขึ้นมากมายเหมือนเช่นเคย รอบนี้ Alan Stewart, SpringSource project lead ออกมาโชว์ความสามารถของ 1.2 release. เช่น multi-module Maven projects, JSF/PrimeFaces integration,… ยาวเกือบ 50 นาทีขอเชิญเสพครับ

Categories: general information Tags:

Micro Cloud Foundry

August 28th, 2011 No comments

ใครยังไม่มีไปสมัครซะ ของเขาดีจริงอะไรจริงครับมันคือ PAAS ที่มีความสมบูรณ์ในตัวเองและสามารถนำมาใช้งานได้ในเครื่อง Mac และ PC ดังนั้นเราจะสามารถสร้าง end-to-end cloud application ได้อย่างสะดวกสะบายอย่างยิ่งแม้กระทั่งการ deploy ก็ยังไม่ต้องเปลี่ยน code แม้แต่บรรทัดเดียว

Categories: news Tags: ,

เข้าใจ AMQ โปรโตคอลที่ถูกใช้โดย RabbitMQ

June 16th, 2011 No comments

พอดีมีงานที่ต้องใช้ Message Broker เลยลองอ่านๆดูหลายๆตัวไม่ว่าจะเป็น ActiveMQ, Open MQ แต่ละอันก็มีความสามารถอลังการแต่มันเยอะไปเลยตัดสินใจไปใช้ RabbitMQ ที่เป็น Messaging Service ที่เรียบง่าย Foot Print น้อย(ใช้ Erlang กระมัง) ติดตั้งง่ายหลังจากลองใช้ไปก็รู้สึกประทับใจจริงๆเลยขอทำความเข้าใจมันและเพื่อไม่ให้ลืมเราก็ต้องจด
โดยแปลมาจาก Understand AMQP the protocol used by RabbitMQ
RabbitMQ คือ lightweight, reliable, scalable และ portable message broker แต่มันไม่เหมือน messages broker ตัวอื่นๆตรงที่แอพพลิเคชั่นของเราจะติดต่อสื่อสารกับ RabbitMQ ด้วย platform-neutral, wire-level protocol ที่ชื่อ the Advanced Message Queuing Protocol (AMQP). ซึ่งเป็นกระบวนการทำงานที่แตกต่างกับการใช้งาน JMS อย่างสิ้นเชิง บางคนอาจจะงงได้ง่ายๆดังนั้นเพื่อใ้ทุกคนเห็นภาพของ AMQ บทความนี้จะยกตัวอย่างการใช้งานออกมาเป็น 3 ลักษณะแต่ก่อนอื่นเรามาเข้าใจแนวคิดพื้นฐานเรื่อง messages broker ก่อน

Exchanges, Queues และ Bindings
AMQ นั้นก็ไม่มีอะไรพิเศษไปกว่า messaging system อื่นคือโปรโตคอลนี้มีเพื่อใช้จัดการกับ publisher และ consumer โดยที่เราคงรู้อยู่แล้วว่า publisher มีหน้าที่ส่ง message ออกไปเพื่อให้ consumer ทำหน้าที่หยิบ message เหล่านั้นไปเพื่อทำงานอะไรบางอย่างและหน้าที่หลักอีกอย่างของ messaging service คือการรับประกันว่า message เหล่านั้นถูกส่งไปยัง consumer ที่ถูกและกระบวนการรับประกันนี้จะเป็นต้องให้เครื่องมืออะไรบางอย่างเข่ามาช่วยนั่นก็คือ Exchange และ Queue นั่นเองถ้าคิดไม่ออกดูรูฟไปก่อน

ดูภาพไปสักพักก็จะสบถว่า “ไม่มีห่านอะไรเลย” เริ่มต้นด้วย publisher ส่ง message ไปให้ exchange จากนั้น consumer ก็เข้ามาหยิบ message ออกไปจาก queue (หรือ queue ทำหน้าที่ push message นั้นไปที่ consumer อันนี้แล้วแต่เราเลือกแผนตามความเหมาะสม) คำถาม? แล้วไอ้สามสี่ท่อนนี้มันต่อกันยังไง แน่นอนมันต้องต่อกันก่อนครับลำดับเป็นไปตามนี้
หน่ึง queue ถูก attached เข้ากับ exchange ที่เราต้องการซึ่งโดยปกติแล้ว consumer จะเป็นคนสร้าง queue ขึ้นมาและทำการ attached เข้ากับ exchange แทบจะทันทีที่สร้าง queue ขึ้นมา
สอง message ที่ถูกรับไว้ที่ exchange นั้นจะต้องมีอะไรบางอย่างที่ตรงกับสิ่งที่ queue กำหนดไว้ ซึ่งกระบวนการแจ้งข้อกำหนดของ queue ต่อ exchange เรียกว่า binding และเพื่อให้เข้าใจกระบวนการ binding เราต้องเข้าใจ คุณลักษณะพื้นฐานของ AMQP message ก่อน

จากภาพเราจะเห็น header และ properties ของ message ที่ไม่มีอะไรมากไปกว่า key/value แต่สิ่งที่แตกต่างระหว่าง header กับ properties คือ header จะถูกกำหนดโดย AMQP เท่านั้นส่วน properties จะเป็นส่วนที่ application สามารถกำหนดค่าให้มันได้และส่วน message content จะเป็นตัวเนื้อความที่เราต้องการสื่อสารซึ่งจริงๆแล้วคือ sequence ของ byte นั่นเอง
ต่อไปแล้วไอ้ header, properties, content มันไปเกี่ยวอะไรกับ binding ล่ะ? คำตอบคือเกี่ยวแน่นอนเพราะใน header เราจะใส่สิ่งที่เรียกว่า routing-key ซึ่งค่าค่านี้จะถูกใช้โดย broker เพื่อตรวจสอบว่า message นั้นๆเหมาะกับ queue หรือไม่ โดยที่แต่ละ queue เองก็จะกำหนด binding key ไว้เพิื่อกำหนดลักษณะของ message ที่ต้องการรับเช่นกันดังนั้นถ้า binding-key ตรงตาม routing-key ก็จะทำให้ queue นั้นได้รับ message ในทันที
อย่างไรก็ตามก่อนจะไปไกลกว่านี้เรามาดูคุณลักษระของ exchange กันก่อนว่ามันทำงานได้กี่แบบ

Exchange type Behaviour
Direct The binding key must match the routing key exactly – no wildcard support.
Topic Same as Direct, but wildcards are allowed in the binding key. ‘#’ matches zero or more dot-delimited words and ‘*’ matches exactly one such word.
Fanout The routing and binding keys are ignored – all published messages go to all bound queues.
Headers
ยกตัวอย่างเช่น publisher ส่ง message ที่มี routing key เป็น “NYSE” ไปที่ exchange ที่ชื่อ “Stocks” ดังนั้นสำหรับ consumer ใดๆที่สร้าง queue เข้ามาต่อกับ exchange โดยใช้ binding key เป็น “#” หรือ “*” หรือ “NYSE” จะทำให้ queue นั้นๆได้รับ message อย่างไรก็ตาม ถ้า message ถูกส่งเข้ามาที่ exchange โดยไปแปะ routing key มาด้วย queue ที่มี binding key เป็น “#” หรือ “*” จะไม่ได้รับ message เนื่องจาก binding key จะถูกใช้การค้นหาในเชิง literals ไม่ใช่แบบ wildcard แบบที่เราคุ้นๆ ดังนั้นเพื่อให้เข้าใจมากขึ้นลองมาดูตัวอย่างกัน ถ้าเรามี routing key เป็น “NYSE.TECH.MSCT” ให้ลองทายว่า binding key ไหนจะได้ message ไป
Binding key Match?
NYSE.TECH.MSFT Yes
# Yes
NYSE.# Yes
*.* No
NYSE.* No
NYSE.TECH.* Yes
NYSE.*.MSFT Yes

ต่อไปเราลองมาดูตัวอย่างการใช้งาน RabbitMQ กัน

Pub(lish)/Sub(scribe)
JMS มีของแบบนี้ AMQP ก็มีเช่นกันและใช้งานง่ายมาดูรูปกันก่อน

ข้อดีของ AMQP คือ queue สามารถ filter message ได้ด้วยการกำหนด binding key ไว้แต่ถ้าต้องการจะรับทุก message ก็สามารถทำได้ด้วยการใส่ binding key เป็น “#” หรือถ้าต้องการกรองด้วยการนับจุดก่อนก็สามารถใส่เป็น “*” หรือ “*.*” ก็ได้

Work distribution
Pattern นี้เหมาะกับ application ที่มีงานต้อง execute เยอะมากๆ และเราไม่ต้องการรอเราสามารถสร้าง queue ขึ้นมาหนึ่งอันแล้ว worker เข้ามาร่วมใช้ queue นี้โดยที่ publisher ไม่สนใจว่าใครจะได้งานไปทำแต่รับรองว่ามรคนเอาไปทำแน่ๆ
Configuring it is pretty straightforward, as shown in this diagram:

และแน่นอนว่ามี consumer หรือ worker เพียงคนเดียวเท่านั้นที่ได้งานไปทำ สองอันนี้เป็นแค่ตัวอย่างพื้นๆถ้าอยากรู้รายละเอียดมากขึ้นแนะนำให้ไปอ่านต่อที่เว็บ RabbitMQ นะจ๊ะ

Categories: general information Tags: ,

Spring + GWT + Maven (Part1)

March 17th, 2011 No comments

สวัสดีครับทุกท่าน อันที่จริงว่าจะเขียนเรื่องนี้มานานละ แต่ไม่ได้เขียนซะที คราวนี้สบโอกาสพอดีจะทำ Workshop ให้น้องๆ ที่คณะครับ ก็เลยกะว่าเอามาโพสที่นี่ด้วยเลยก็แล้วกันครับ เนื้อหาก็เป็นการแบ่งปันประสบการณ์ของผมเองที่ผ่านมาหนึ่งโปรเจ็ค กับการใช้ GWT มาแบ่งปันกัน คงไม่ได้ลึกอะไรมากนะครับ เพราะลึกๆ ผมก็ไม่รู้เหมือนกัน ใช้งานเป็นอย่างเดียว 55

ผมจะแบ่งเขียนเป็น Series นะครับ น่าจะมีราว 3 ตอน คือ

1. Maven GWT Get Start : How to create GWT project using Maven

2. Spring GWT Get Start : Basic concept and configuration

3. Introduce SmartGWT

ว่าแล้วมาเริ่มตอนที่ 1 กันดีกว่าครับ

Maven GWT Get Start : How to create GWT project using Maven

Step 1 Preparing Environment

อย่างแรกเลยก็ต้อง เตรียมของกันก่อนเนอะ ก็มีตามนี้ครับ

JDK5 ลงให้เรียบร้อยครับ อย่าลืมสร้าง JAVA_HOME ให้มันด้วย

Maven2 ลงให้เรียบร้อยเช่นกันครับ อย่าลืมสร้าง M2_HOME ให้มันด้วย

Step 2 Creating Project

อะ อะ อะ แล้วพระเอกของเราหล่ะ ไปไหน ไม่ต้องห่วงครับ เราจะใช้ archetype GWT Maven plugin ช่วยสร้างโปรเจ็คครับ Maven ช่างสะดวกเสียจริง ว่าแล้วก็สร้างกันเลยครับ โดย รัวคีย์บอร์ด เจ้าบรรทัดข้างล่างนี้ลงไปเลยครับ


mvn archetype:generate

-DarchetypeRepository=repo1.maven.org

-DarchetypeGroupId=org.codehaus.mojo

-DarchetypeArtifactId=gwt-maven-plugin

-DarchetypeVersion=2.2.0

จากนั้นเมื่อเรากด Enter แล้ว maven มันจะให้เราใส่ groupId, artifactId, version และ gwt module ครับ เราก็ใส่ไปตามที่เราอยากได้ ส่วนของผมใสแบบนี้ครับ

GroupId : com.spring66
ArtifactId : SpringGWT
Version : 1.0-SNAPSHOT
Module name : MyGWTApplication

จากนั้นพอกด Enter แล้ว maven ก็จะทำการสร้างโปรเจ็ค หล่อๆ ให้เราทั้งหมดครับ

สำหรับ Eclipse IDE นะครับ มันจะมีปัญหานิดหน่อย ไม่รู็คนอื่นเป็นกันมั้ย แต่ผมเป็น คือ maven dependedcy management มันไม่ทำงาน วิธีแก้คือไป disable มันก่อนครั้งหนึ่ง แล้ว enable มันอีกทีครับ แค่นั้นก็ได้แล้วครับ

Step 3 Let’s play

เมื่อได้โปรเจ็คมาแล้วนะครับ เราจะลองรันกันดูนะครับ โดยก่อนอื่นต้อง mvn clean install ก่อนเลย ถ้าเปิดใน netbean นะครับ เพราะว่า project ที่ได้ มันจะยังไม่ generate code บางอย่างให้เราไม่ครบ เราเลยต้อง build โปรเจ็คก่อนหนึ่งรอบครับ

จากนั้นก็ลอง mvn gwt:run ดูครับ

เราควรจะเจอ pop up window หน้าตา แบบนี้ออกมาครับ

แล้วเราก็กด Launch Default Browser ครับ ก็จะเจอ UI หน้าตาแบบนี้ครับ

สวยมั้ยครับ แถมมี validation ด้วยนะเอ่อว์ (ถ้าใส่ไใ่ครบ 3 ตัวอักษร ลองดูครับ)

Step 4 Jump into the hole

หลังจากเห็นความหล่อของ GWT แล้ว เรามาดูข้างใน Project Structure กันดีกว่า

อันนี้คือ Layout ของโปรเจ็คนะครับ จะเห็นว่าชื่อโปรเจ็ค ไม่ตรงกับของผม เพราะไป copy เค้ามาครับ สังเกตุว่า โดยรวมแล้วก็น่าตา เหมือนกันกับ Maven Structure ปกติ

ดูใน src/main/java ครับ จะเห็นว่ามี 3 packages อยู่ข้างในคือ

client : เอาไว้เก็บ code ที่เป็น GWT ทั้งหมดครับ และถ้ามี domain object เราก็จะเก็บไว้ภายใต้ package นี้ด้วยเช่นกันครับ ในตอน compile ของทุกอย่างใน package นี้จะถูกแปลงเป็น JavaScript ทั้งหมดนะครับ ระวังอย่าเอาอะไรที่นอกเหนือจาก การทำ User Interface เ้้ข้าไปไว้ข้างในนะครับเดี๋ยว Error

server : เอาไว้เก็บ code ทำงานฝั่ง server ทั้งหมดครับ แต่ถ้าเราทำฝั่ง server เป็น RESTful เราก็ไม่ต้องมี package นี้ก็ได้ครับ เพราะส่วนใหญ่เราจะแยก โปรเจ็ค กันไปเลย

shared : อันที่จริง สำหรับ package ใน gwt-maven plugin version 1.2 มันเอาไว้เก็บ พวกรูป icon ที่เราใช้ ใน ฝั่ง client แต่ใน version ใหม่ (หลังจาก 2.1 เป็นต้นมา) ผมยังไม่ค่อยแน่ใจครับ ยังไม่ขอตอบละกันครับ เดี๋ยววันหลังมาเพิ่มเติมให้ใหม่

ต่อมาใน src/main/resources ครับ

ในนี้มีไฟล์ประเอกของเราอยู่ครับ มันคือ Module ไฟล์ครับ ซึ่งในโปรเจ็คของเราก็คือ MyGWTApplication.gwt.xml นั่นเองครับ เ่อ่ามาดูข้างในกันดีกว่า


<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='MyGWTApplication'>
<!-- Inherit the core Web Toolkit stuff.                        -->
<inherits name='com.google.gwt.user.User'/>

<!-- Inherit the default GWT style sheet.  You can change       -->
<!-- the theme of your GWT application by uncommenting          -->
<!-- any one of the following lines.                            -->
<inherits name='com.google.gwt.user.theme.standard.Standard'/>
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->

<!-- Other module inherits                                      -->

<!-- Specify the app entry point class.                         -->
<entry-point class='com.clbs.ex.springgwt.client.MyGWTApplication'/>

<!-- Specify the paths for translatable code                    -->
<source path='client'/>
<source path='shared'/>

</module>

ดูกันทีละอันก็แล้วกันครับ
อันแรก tag <inherits> นะครับ อันนี้เอาไว้ inherit module และ theme ต่างที่มีใน GWT โดยอย่างน้ยที่สุดจะต้อง inherit com.google.gwt.user.User และ theme com.google.gwt.user.theme.standard.Standard ครับ

ต่อมา tag <entry-point>  เป็น tag ที่เราใช้มากที่สุดครับ คือ เอาไว้ระบุว่า class ไหนจะเป็น class ที่เราเอาไว้โหลด User Interface ของเราครับ ซึ่ง class ที่จะเป็น entry-point ได้ จะต้อง inherit EntryPoint ด้วยครับ
เช่นในโปรเจ็คเรา ถ้าไปดู MyGWTApplication ใน package client ก็จะเห็น

public class MyGWTApplication implements EntryPoint {
..
}

สุดท้ายเราต้องระบุ source ที่จะถูก compile ไปเป็น JavaScript ครับ โดยใช้ tag <source> ครับ

ในโปเจ็คเราก็ระบุไว้สองที่ครับ คือ client กับ shared

<!-- Specify the paths for translatable code                    -->

<source path='client'/>

<source path='shared'/>

แค่นี้ก่อนครับ หมดแรง เดี๋ยวคราวหน้าเราจะต่อด้วยเรื่องของการผูก GWT กับ Spring กับ จริงๆ จังๆ ครับ

Categories: how to, tutorial series Tags: , ,