วันพฤหัสบดีที่ 9 ตุลาคม พ.ศ. 2551

การแก้ไข Crystal Report Error - Unexpected error determining relative path

การแก้ไขนะครับ
คือมันจะหา File rpt ไม่เจอเราเลยจะทำการไปลบ Config CRConfig.xml ที่เป็น reportlocation ทิ้งไปน่ะครับ แล้วตอนเรียกให้เรียกตรงๆ จาก Path เลย เช่น C:/Temp/test.rpt มันก็จะทำงานได้เลยครับ

ปล.
1. เราจะเอา CRConfig.xml ไปไว้ที่ classes
2. ถ้าเราไม่อ้าง Path rpt ตรงๆ สามารถนำไปวางไว้ที่ classes ก็จะเรียกได้เหมือนกันครับ

วันศุกร์ที่ 19 กันยายน พ.ศ. 2551

การ Add Notify สำหรับ Websphere 6.x Scheduler

การ Add Notify คือเราการที่เราจะดักข้อมูลของ Scheduler เช่น ตอนนี้ทำงานหรือยัง, สำเร็จ หรือไม่สำเร็จ เป็นต้นครับ
Copy มาเลยครับ
  1. สร้าง EJB Notify ขึ้นมาก่อน สร้างเหมือน EJB ปกติ ครับ แต่ ให้ใช้
    1. Home : com.ibm.websphere.scheduler.NotificationSinkHome
    2. Remote : com.ibm.websphere.scheduler.NotificationSink
  2. Add Method handleEvent(TaskNotificationInfo info) ลงไปที่ EJB ตัวที่เราสร้าง โดยเราสามารถดักได้ว่าเป็นอะไรจาก getEventType()  แล้วไปเช็คจาก TaskNotificationInfo.XXX ครับ จะมีให้เลือกอยู่
  3. พอทำเสร็จแล้วเราจะ Set ลงไปที่ Task ของเราที่ต้องการ โดย ใช้ setNotificationSink(<Notification ที่เ&ราสร้างขึ้นมาgt;, <EventType ที่เ&ราต้องการจะดักจับgt;)
    1. โดยเราจะดึงค่า Notification EJB จากการ LookUp ขึ้นมา ใช้วิธีดังนี้ 
      • Lookup ด้วย Context ได้ Object
      • ใช้ PortableRemoteObject.narrow(Obj ที่ได้มาจากการ Look Up , HomeClass ตัว NotificationSinkHome) ได้ Class Home แล้วใช้ตัวนี้ล่ะครับ

วันอังคารที่ 16 กันยายน พ.ศ. 2551

อธิบายเพิ่มเติม Quick Seam จาก http://www.seam66.com/blog/?p=67

ผมลองทำตามที่นี่เลยครับ http://www.seam66.com/blog/?p=67
ผมเขียนอธิบายเพิ่มเติมเอาน่ะครับ เพราะผมไม่รู้เรื่องน่ะครับ ว่ามันจะต้อง Config ยังไงเอาไปวางไว้ไหน เลยเขียนมาเผื่อใครไม่รู้จะได้รู้น่ะครับ 
ปล. ถ้าอ่าน seam มาก่อนข้ามไปเลยครับ สำหรับคนที่ไม่รู้อะไรเลยแบบผม

1.  ขั้นแรกก็ติดตั้งก่อนที่ http://www.seam66.com/blog/?p=62
2. แล้วเราจะได้ Project Default มาชื่อ myproject ซึ่งจะอยู่ที่ C:\Projects\
3. พอเสร็จแล้ว เราก็จะ import Project เข้า Eclipse (3.4) โดยการคลิกขวาเลือก import แล้ว คลิกที่ General --> Existing Projects into Workspace พอเสร็จเราก็จะได้ Workspce สำหรับใช้ seam ล่ะครับ
4. ถ้าเกิด sever ของ jboss เปลี่ยนไม่ตรงเหมือนใน Eclipse ที่ Config ไว้ ให้เข้าไปแก้ที่ build.properties ให้แก้ jboss.home ไปที่ที่ Server ที่ Eclipse Config
5. ต่อมาเรามาทำ Quick Seam ตาม http://www.seam66.com/blog/?p=67
6. โดย File แ รก  เ ป็นส่วนที่ไ ว้สำหรับแ สดงผลออกหน้าจอ ให้เรา create ชื่ออะไรก็ได้ ลงท้ายด้วย .xhtml แล้ว เอา File ไปวางไว้ที่ view ครับ
7.  ต่อไปอีก File นึงเป็น Java File ไปวางไว้ที่ packace ที่เป็น Source Folder โดย ใน File นั้นเราอาจจะต้อง Import Package บางส่วนเพิ่มเข้ามา เพื่อให้มันไม่ error นะครับ
8. พอทำเสร็จลอง Save ทั้งหมด แล้ว Restart JBoss ดู ก็น่าจะใช้งานได้แล้วนะครับ
9. ลองอ่านคำอธิบายเพิ่มเติมได้ http://www.seam66.com/blog/?p=77

ปล. โดยปกติ ถ้าเรา Import เข้ามาแล้วมันจะ Auto Deploy ลง JBoss Server ให้เลยนะครับ สามารถดูว่ามันขึ้นได้หรือเปล่า ถ้าไม่ขึ้น อาจจะ Config JBoss Home ผิดใน build.properties ครับ

Basic ZK Framework ตอนที่ 6 การใช้งาน paging

อันนี้ทำแบบง่ายๆ ครับ คือใช้หลักการ Event Listener แบบ ตอนที่ 5 ครับ
แต่อันนี้เราจะใช้ onPaging แทน โดยทำดังนี้
1. โดยเราไปเขียนเพิ่มที่ Zul File เพิ่ม paging เข้าไป แล้ว เราจะใช้ id เป็นตัวเรียก
2. ก็ไป AddEventListener ที่ paging ตัวนั้นเป็น onPaging โดยตัว paging จะมี Config 
  1. pageSize จะเป็นตัวบอกว่าในหน้านึงมีกี่อัน
  2. totalSize จะเป็นบอกว่ามีข้อมูลทั้งหมดเท่าไร
  3. activePage เป็นตัวบอกว่าเราอยู่หน้าไหน โดยจะเริ่มที่ 0

ต่อไปเป็นตัวอย่าง

Paging pag = (Paging)this.getFellow("pageUser"); --> id ที่เรา Config ไว้ที่ Zul File
pag.setPageSize(10); --> จำนวนข้อมูลต่อหน้า

pag.setTotalSize(100); --> จำนวนข้อมูลทั้งหมด
pag.addEventListener("onPaging", new EventListener() {
public void onEvent(Event event) {
PagingEvent pe = (PagingEvent) event;
int pgno = pe.getActivePage();
int ofs = pgno * 10;

//ใส่เพื่อจะให้ทำอะไร ถ้ากดที่ Paging แล้ว

}
});

วันจันทร์ที่ 15 กันยายน พ.ศ. 2551

Basic ZK Framework ตอนที่ 5 วิธี Add EventListener บน Java

การ Add EventListener ก็เหมือนกับว่าเราร้อยสายจาก Java ไปที่หน้าจอน่ะครับ เช่น เราบอกว่า onClick จะให้ไปทำอะไรเราสามารถมาเขียนที่ Java ได้เลย ว่าถ้ามี onclick แล้วจะให้ไปทำอะไรต่อ โดยที่เราไม่ได้ไปทำที่ ZUL File น่ะครับ (ถ้าไม่ เข้าใจโทษทีครับ ลองทำดูจะเข้าใจมากขึ้น) 

ที่ผมจะสอนคือวิธีแบบธรรมดาที่เราใช้กับพวก onClick, onChange, etc... วิธีีดังนี้
1. เราจะทำการใช้ method ที่ชื่อ  addEventListener ซึ่งจะมีอยู่แล้วในพวก class ใน package org.zkoss.zul เช่น Label, Image
2. ซึ่งใน Method นี้จะมีการใส่ 2 ค่า โดยค่าแรกจะเป็น Event ที่เราต้องการจะดักจับ เช่น onClick เป็นต้น --> ใส่คำนี้ลงไปเลยครับ เพราะรับค่า็เป็น String อยู่แล้ว
3. ต่อไปค่าอีกค่าจะใส่ Class EventListener เราจำต้อง สร้าง Class นี้ขึ้นมาเพื่อรับ ซึ่งจะมี Method บังคับคือ onEvent ซึ่งส่วนนี้นี่ล่ะ เราจะเอาไว้สำหรับว่าจะทำอะไรที่เราต้องการ

ตัวอย่่างที่ทำไว้นะครับ

อันแรกตัว EventListener

private EventListener selectItemListener = new EventListener() {

public void onEvent(Event evt) {

Image img = (Image)evt.getTarget(); เราจะทำการดึงค่าออกมาจากที่เรา addEventListener ไว้ครับ

UserM userM = (UserM)img.getAttribute("sampleUserM"); ดึงค่า attribute ที่เรา set ลงเราสร้าง Image ขึ้นมา

Executions.getCurrent().sendRedirect("zk/sample/userEdit.zul");

}

public boolean isAsap() {
return true;
}
};


ส่วนวิธีเรียกใช้งาน อันนี้ผมทำแบบ Add ใส่ตารางไว้แล้วถ้าเรามา Click จะไปทำงานที่ Event นะครับ

Listcell listCell = new Listcell();
listCell.setStyle("cursor: default");
listCell.appendChild(image);
Image image = new Image("images/edit.gif");
image.setAttribute("sampleUserM", userM); ทำการ set Attribute ชื่อ SampleUserM ขึ้นมา เราสามารถไปเรียกค่าขึ้นมาได้ที่ onEvent ใน EventListener เลยครับ
image.setWidth("23px");
image.setHeight("21px");
image.setStyle("cursor: pointer;");

image.addEventListener("onClick",selectItemListener); ทำการ Add EventListener ในกรณีที่เรา Click ที่รูปนี้


Reference
http://www.zkoss.org/smalltalks/mvc3/ จาก @chanwit  อันนี้จะมีวิธีอื่นด้วยน่ะครับ

วันอังคารที่ 9 กันยายน พ.ศ. 2551

Basick ZK Framework ตอนที่ 4 Config ZK ให้เรียก EJB [On Java File]

เหมือนกับตอนก่อนหน้านี้น่ะครับ แต่อันนี้จะเรียกผ่าน Java เลย ซึ่งที่ผมลอง มีได้ตามนี้ครับ
  1. ถ้าเรียกแบบ Remote EJB สามารถเรียกได้อยู๋แล้วนะครับ คือเรียกอบบบอก IP ไปเลยว่าจะไปที่ไหน สามารถเรียกได้ไม่มีปัญหาครับ
  2. เรียก Local EJB ผมใช้วิธีนี้นะ่ัครับ มีสองวิธี แต่การทำงานคล้ายๆ กัน (โดย Load ใน Servlet ก่อน หรือ บน ZUL File ครับ)
    1. ไป Lookup EJB เสร็จแล้วเก็บค่าไว้ที่ static class สักตัวนึง เช่น Map
    2. ไป Lookup EJB เหมือกนั แต่เก็บไว้ที่ ServletContext เลยครับ
ตัวอย่างการเขียนแบบง่ายๆ ครับ ผมเขียนตอนเรียกไว้ที่ init ใน Servlet แล้วสั่งให้มัน Load on start up

แบบแรกเก็บค่าไว้ที่ static class

public class SampleContext {
private static Map contextJNDI;

เรียกตอน init ใน servlet แล้วสั่งให้ทำตอน load on startup
public void initContext(String jndiName) throws NamingException, CreateException {
Context context = new InitialContext();

ZKServiceEJBLocalHome home = (ZKServiceEJBLocalHome) context.lookup(jndiName);

ZKServiceEJBLocal localObject = home.create();

if(contextJNDI == null) {
contextJNDI = new HashMap();
}

if(contextJNDI.get(jndiName) == null) {
contextJNDI.put(jndiName,localObject);
}
}

อันนี้จะไปเรียกตอนทำงานใน Java ครับ
public ZKServiceEJBLocal getEJB(String jndiName) {

return (ZKServiceEJBLocal)contextJNDI.get(jndiName);

}
}


แบบที่สอง เก็บไว้ที่ ServletContext

เขียนไว้ที่ init ใน Servlet แ ล้ว Config ให้ Load on startup
servletConfig.getServletContext().setAttribute(jndiName, EJBLocalObject); --> jndiName ให้ตอนเวลาจะดึงข้อมูลมาใช้ให้ดึงด้วย jndiName ส่วน EJBLocalObject คือตัว EJBLocal ที่เรา Lookup ใน Context เรียบร้อยแล้ว ล้วเอามาเก็บไว้ที่นี่แทนครับ

ตอนเรียกใช้
ServletContext servletContext = (ServletContext)this.getDesktop().getWebApp().getNativeContext();
servletContext.getAttribute(jndiName);

วันจันทร์ที่ 8 กันยายน พ.ศ. 2551

Basick ZK Framework ตอนที่ 3 Config ZK ให้เรียก EJB [On ZUL File]

สามารถใช้เรียกได้หมดเลยนะครับ ที่เรียกโดยใช้ JNDI แต่เรียกบน ZUL File นะครับ 
โดยเราเพิ่มว่าโหลด JNDIResolver เข้าไปน่ะครับ

<?variable-resolver class="org.zkoss.zkplus.jndi.JndiVariableResolver"
arg0="ZKSampleEAR" --> ใช้สำหรับบอกว่า Application Name ของ Ear File
arg1="sampleEJB=java:comp/env/ejb/sample/zkservice"  --> บอกว่าใช้ EJB Name ชื่ออะไรน่ะครับ แล้วเวลาตอนเรียกใช้จะใช้ sampleEJB ครับ
?>


โดยวิธีการเรียกใช้งานจะเป็นดังนี้


<zscript>
import sample.zk.SampleServiceLocal; <--- Import Class ที่เราใช้เข้ามา
SampleServiceLocal sampleBean = (SampleServiceLocal)sampleEJB; <-- Cast Class ให้เป็นตัวที่เราต้องใช้งานครับ
SampleServiceLocal.doService(); <--- เรียกการทำงาน
</zscript>

*สำหรับคนที่ใช้ Rad deploy บน Websphere ครับ
อันที่จริง Application Server ก็ต้องทำเหมือนกันครับ แต่ผมจะบอกวิธีสำรับคนที่ใช้บน Rad ครับ โดยไป double click ที่ web.xml แล้วไปที่ Tab Reference แล้ว Add EJB Reference เข้าไป โดยชื่อที่เราใช้เรียกจะเป็น อันบนด้านขวา แต่อันล่างด้านขวาจะไป mapping กับ ที่ไปเรียกที่ EJB Project น่ะครับ


Reference

วันพฤหัสบดีที่ 4 กันยายน พ.ศ. 2551

Basick ZK Framework ตอนที่ 2 มาลองใช้ Zk

มาต่อตอนที่ 2 กันครับ ตอนที่ 1 ดู ที่นี่
ตอนนี้มาลองเล่นกันเลยว่ามันทำงานอย่างไรบ้าง


ตัวอย่าง index.zul

<?xml version="1.0" encoding="UTF-8"?>
<?page title="Welcome to ZK Web"?> <-- กำหนดว่า title ของหน้าใช้ชื่ออะไร
<window title="Welcome to ZK Web" 
border="normal" id="login" use="com.zk.LoginView" onOK="login.onOk()">
use ใช้สำหรับว่าจะไปใช้ Java Class ไหน ส่วน id จะเป็น Reference ไว้สำหรับใน window ตัวนี้ โดยเวลาใช้จะใช้ id.method ที่จะใช้น่ะครับ
<textbox id="username"/> <--  กำหนดว่าเป็น input แบบข้อความ โดยกำหนดชื่อเป็น username
และ onOK หมายถึงถ้าเรากด Enter ที่หน้านี้จะเข้าไปทำงานที่ login.onOk()
<button label="OK" onClick="login.onOk()"/> <-- เป็นการบอกว่าถ้ากดปุ่มนี้จะไปที่ Method ชื่อ onOk() ใน Class com.zk.LoginView
<button label="Cancel" onClick="login.onCancel()"/> <-- จะเหมือนกับ ข้างบนครับ
</window>


ต่อไปตัวอย่างของ Java Class นะครับ

package com.zk.service;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.apache.log4j.Logger;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;


public class LoginView extends Window { <-- ทำเพื่อให้เพื่อเราสามารถดึงค่าได้

private static final long serialVersionUID = -8725354218872079732L;
private static Logger log = Logger.getLogger(LoginView.class);

public void onCreate(Window main) { //does initialization
log.debug("..... init(Window main)");
}

public void onOk() {  <-- พอเรากด Ok ที่หน้าจอจะมาเข้า Method นี้
log.debug("..... save(Window main)");
String userName = ((Textbox)getFellow("username")).setValue(""); <-- ดึงค่าจาก textbox เมื่อกี้ที่ใช้ id เป็น username
Messagebox.show("Username correct.", "Ok", Messagebox.OK, Messagebox.OK); <-- โชว์ Popup บอกว่า Username correct. 

}

public void onCancel() { //cancel any changes
log.debug("..... cancel(Window main)");

((Textbox)getFellow("username")).setValue(""); <-- เป็นการกำหนดค่าให้ username เป็นค่าว่าง

}
}

วันอังคารที่ 2 กันยายน พ.ศ. 2551

Basick ZK Framework ตอนที่ 1 Config ZK

สามารถ Download ได้ ที่นี่
เป็น Ajax Framework ที่ไม่ต้องมานั่งเขียน Java script น่ะครับ หาข้อมูลเพิ่มเติมได่ที่หน้าเวบ

* สามารถใช้บน Websphere 6.x ได้ครับ ลองมาแล้ว Config เหมือนกันเลย

ตอนนี้จะบอกว่าเราต้อง Config อะไรเพิ่มใน web.xml บ้างนะ่ครับ ที่จริงก็อ่านได้ตามเวบเหมือนกัน ผมรวบรวมไว้จะได้ค้นง่ายๆ

เพิ่มส่วนของ Listener ด้วย

<listener>
<description>Used to cleanup when a session is destroyed</description>
<display-name>ZK Session Cleaner</display-name>
<listener-class>org.zkoss.zk.ui.http.HttpSessionListener</listener-class>
</listener>


ต่อไปเพิ่มในส่วยของ Servlet

<servlet>
<description>ZK loader for ZUML pages</description>
<servlet-name>zkLoader</servlet-name>
<servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>
<init-param>
<param-name>update-uri</param-name>
<param-value>/zkau</param-value>
</init-param>
<load-on-startup>1</load-on-startup> สำหรับตรงนี้ ถ้า Config บน Websphere อาจจะต้องลองเปลี่ยนเลขดูน่ะครับ ถ้ามันยังไม่ได้
</servlet>

<servlet>
<description>The asynchronous update engine for ZK</description>
<servlet-name>auEngine</servlet-name>
<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
</servlet>


หลังจากนั้นก็เพิ่ม Servlet-Mapping

<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>*.zul</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>*.zhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>auEngine</servlet-name>
<url-pattern>/zkau/*</url-pattern>
</servlet-mapping>


เป็นอันเสร็จครับ ก็จะทำให้ใช้ Zk Framework ได้ล่ะ


ลองเทสโดยการเขียน index.zul แบบนี้ดูครับ ว่ามันขึ้นหน้าจอหรือเปล่า

<window title="My First window" border="normal" width="200px">
Hello, World!
</window>

วันอังคารที่ 29 กรกฎาคม พ.ศ. 2551

Config Servlet Cache Instances [On Websphere 6.0-6.1]

จะสอนวิธี Config Servlet Cache ของ Websphere ซึ่งมีวิธี 3 แบบครับ

ฮธิบายก่อน Servlet Cache คือ การเก็บค่าไว้โดยที่ไม่ต้องทำการประมวณผลใหม่ในกรณีที่เราเข้ามาด้วย parameter เดิมนะครับ (ที่จริงมีกำหนดหลายแบบ ผมขอบอกเฉพาะที่เป็น Parameter นะครับ) เช่น สมมตผมกำหนด ว่าให้ Servlet SampleCache ไว้เป็น Servlet Cache แล้วกำหนด Parameter ให้ productId เป็นไว้ เมื่อเราเข้าหน้าเวบด้วย productId=1 ครั้งแรกจะยังเข้า Servlet อยู่ แล้วครั้งต่อๆ ไปพอเราลอง Refresh หน้าดูแล้วจะไม่มีการเข้าไปใน Process ของ Servlet อีกครับ จะใช้ค่าเดิมที่เราเข้าไปครั้งแรกเลย (สามารถกำหนด Timeout ได้ครับ)

เราต้อง Config ให้ Websphere ใช้งาน Servlet Cache ก่อนโดย

  1. ไปที่ Servers --> Application Servers
  2. แล้วเลือก Server ที่เราต้องการจะ Config Servlet Cache
  3. ดูที่ทางขวา จะมี Container Settings ให้เลือกที่ Web Container Settings --> Web Container
  4. พอกดเข้าไปจะเห็น Enable Servlet Caching แล้วติ๊ก
  5. พอทำเสร็จก็ Restart Server ครับ เป็นอัน Config Servlet Cache ให้ใช้งานได้ล่ะ

ต่อไปเรามา Config Servlet Cache ที่เครื่องเราต่อ (ผมใช้ Config จาก cachespec.xml) ตอนแรกเราจะต้องไปเอา cachespec.xml, cachespec.dtd มาก่อน โดยจะอยู่ที่ xxx\base_v6\properties ครับ แล้ว Copy มาไว้ที่ Project ของเรา ที่ Path --> WEB-INF


แบบที่ 1 จะเป็นการ Config ให้ดูที่ Path

<cache-entry>
<class>servlet</class> --> กำนหดให้เป็นชนิด Servlet
<name>/ProductDisplay</name> --> Servlet Path ชื่อนี้
<cache-id>
<component id="productId" type="parameter"> --> กำหนดให้ Parameter ที่ส่งมาถ้ามีตัวนี้ ซ้ำ จะไม่ทำงานซ้ำ
<required>true</required> --> จำเป็นจะต้องมี Parameter ตัวนี้ส่งมาหรือเปล่า
</component>
<timeout>180</timeout> --> กำหนด Timeout ของ Servlet Cache
</cache-id>
</cache-entry>

แบบที่ 2 กำหนดที่ตัว Class เลย

<cache-entry>
<class>servlet</class>
<name>com.webpage.servlet.ProductDisplay2.class</name> --> บอกว่าเป็น Servlet Class ไหน
<cache-id>
<component id="productId" type="parameter">
<required>true</required>
</component>
<timeout>300</timeout>
</cache-id>
</cache-entry>


แบบที่ 3 จะคล้ายๆ กับแบบแรก แต่จะใช้ Servlet Cache ของ Application Server เลย

<cache-instance name="cache/servlet/sample"> --> กำหนด JNDI Name ของ Servlet Cache
<cache-entry>
<class>servlet</class>
<name>/ProductDisplay3</name>
<cache-id>
<component id="productId" type="parameter">
<required>true</required>
</component>
<timeout>180</timeout>
</cache-id>
</cache-entry>
</cache-instance>


วิธี Config Servlet Cache ของ Application Server

  1. ให้ไปที่ Resources --> Cache instances --> Servlet cache instances
  2. คลิกเข้ามาเสร็จ ก็เลือก New
  3. แล้วกำหนดชื่อ JNDI Name ให้เป็นชื่อเดียวกับ ที่เรากำหนดใน cachespec.xml
  4. Save แล้วก็ Restart Server เป็นอันเสร็จ


Reference
http://www.webagesolutions.com/knowledgebase/waskb/waskb008/index.html

วันศุกร์ที่ 4 กรกฎาคม พ.ศ. 2551

Data store tables
























Table namePurpose
SIBOWNEREnsure exclusive access to the data store by an active messaging engine
SIBCLASSMAPCatalogs the different object types in the data store
SIBLISTINGCatalogs the SIBnnn tables
SIBXACTSMaintain the status of active two-phase commit transactions
SIBKEYSAssign unique identifiers to objects in the messaging engine
SIBnnn, where nnn is a numberContain persisted objects such as messages and subscription information

These
tables hold both persistent and nonpersistent objects, using separate tables
for the different types of data, according to the following convention:


  • SIB000 contains information about the structure of the data in the other
    two tables

  • SIB001 contains persistent objects

  • SIB002 contains nonpersistent objects that have been saved to the data store to reduce the messaging engine memory
    requirement





Reference

Data store tables

วันศุกร์ที่ 9 พฤษภาคม พ.ศ. 2551

วิธีการสร้าง Profile ใหม่บน RAD 6.0

C:\IBM\WAS 6.0\profiles\AppSrv01\installedApps\naphacharaNode01Cell\DefaultApplication.ear\DefaultWebApplication.war\WEB-INF

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

  1. ไปที่ Window --> Preferences
  2. ต่อไป ไปที่ Server เลือก Websphere

  3. มันจะขึ้นหน้า Websphere แล้วเลือกที่ Create Profile

  4. รอสักพัก จะขึ้นหน้าดังรูป


  5. แล้วก็ Next จะให้เรากรอก Profile Name





  6. พอทำข้อ 5 เสร็จ ก็ Next จะเป็นการสร้าง Directory ของ Profile ไว้ว่าจะเอาไว้ที่ไหน






  7. Next ต่อไปจะเป็นการตั้งชื่อ Node กับ HostName






  8. Next จะเป็นการกำหนด Port ต่างๆ ของ Websphere (Default เลยครับ)






  9. Next หน้านี้สำคัญครับ ให้ติกเอา Run the Application Server process as a Windows Service ออกนะครับ






  10. Next จะเป็นสรุปว่าต้องที่เรา Config ถูกต้องไหม ต้องใช้พื้นที่เท่าไร






  11. Next จะ Install Profile ใหม่ลง






  12. พอเสร็จแล้วมันจะบอก Finish แล้วเราก็จะสามารถ Create Server ลงที่ Profile ใหม่ได้เลย ทำจากหน้า Server ใน Rad 6.0 เลยครับ ง่าย






วันอังคารที่ 6 พฤษภาคม พ.ศ. 2551

SQL ไว้สำหรับนับจำนวน Cursor ที่เิปิดใน Oracle ครับ

เอาไว้สำหรับดูว่ามี Cursor อะไรเปิดอยู่บ้างใน Oracle ครับ

select sid, sql_text from v$open_cursor order by sid, sql_text


Reference
http://forum.java.sun.com/thread.jspa?threadID=135291

วันศุกร์ที่ 2 พฤษภาคม พ.ศ. 2551

Path Log ของ XA Datasource

Path จะอยู๋ประมาณนี้น่ะครับ จะอยู๋ใน tranlog น่ะครับในแต่ละ Profiles ซึ่งสาเหตุที่เราไปลบเพราะว่า บางทีWebsphere จะมี Log Error ค้างอยู่ใน Server ซึ่งที่ผมเห็นจะเกิดจาก XA Datasource น่ะครับ แล้วมันจะค้างตลอดใน Server เราเลยต้องตามไปลบ ไม่งั้นมันก็จะขึ้นตลอดน่ะครับ


จะขึ้นประมาณข้างล่างนี้น่ะครับ
[5/2/08 15:51:43:720 ICT] 00000050 RegisteredRes E WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.
[5/2/08 15:51:43:723 ICT] 00000050 RegisteredRes E WTRN0086I: XAException encountered during prepare phase for transaction 00000119A8D46B1C000000010004EC456280C5DF303AAF4EFAC6AC2CC0E8082A1BD2474A00000119A8D46B1C000000010004EC456280C5DF303AAF4EFAC6AC2CC0E8082A1BD2474A00000001. Local resources follow.
[5/2/08 15:51:43:725 ICT] 00000050 RegisteredRes E WTRN0089I: XATransactionWrapper@ cdc2b3 XAResource: com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@1539da0 enlisted: true mcWrapper.hashCode()31227578: Vote: commit.

วิธีแก้ว่าไม่สามารถใช้ Datasource ที่สร้างใหม่ได้

คือเวลาสร้างเสร็จแล้วลอง Test Connection แล้วไม่สามารถที่จะ Test ผ่านน่ะครับ จะขึ้นประมาณว่า
invalid arguments in callDSRA0010E: SQL State = null, Error Code = 17,433
แบบนี้ ผมได้ข้อมูลตามลิงค์ข้างล่างน่ะครับ

เหตุผลจากคุณ Ken Hygh
1) the application isn't closing connections and is thus 'leaking' them.
2) the database doesn't have enough 'listeners' for the number of
connections you're trying to open. This generally happens in a clustered
environment, where the database must support #Connections x #Servers.
3) there's a database call that's taking a very long time, and
eventually every configured connection gets into this call and until one
completes, no other threads can get a connection.

วิธีแก้ง่าย ก็ Restart Server นั้นครับ ก็จะใช้งานได้เลย

Reference
http://www.ibm.com/developerworks/forums/message.jspa?messageID=13762630

วันศุกร์ที่ 11 เมษายน พ.ศ. 2551

Guideline สำหรับ Update RAD

อันนี้เป็นแนะนำวิธีการที่จะ Update RAD ผ่าน Update Manager น่ะครับ เพราะบางทีการอัพจะมีปัญหา ผมเลยเขียนขั้นตอนง่าย ว่าควรจะทำอย่างไรเพราะบางที Update ไปแล้วใช้งาน RAD ไม่ได้ ทำให้บางทีอาจจะต้องเสียเวลาลงใหม่ ถ้าเป็น Eclipse ผมคิดว่าไม่น่าจะมีปัญหาอะไรเพราะ ใช้ Copy วางไว้ ไม่ต้องเสียเวลา Update ผ่าน Update Manager ได้ครับ มีขั้นตอนดังนี้
  1. ควรจะ Update ทีละตัว แล้วลองเทสดูว่าเข้า RAD ได้หรือไม่ ถ้าเข้าได้ก็อัพเดท อันต่อไป
  2. เริ่ม Update จาก ตัวที่เป็น Developer ก่อน แล้วควรจะ Update ใน Update ให้หมดก่อน ค่อยไป Optional Feature
  3. ไม่ควรลบข้อมูลในหน้า RollBacks (เพิ่อเพิ่มเนื้อที่ใน HDD น่ะครับ) ถ้าจะลบได้ ควรลองใช้ RAD สักสองสามวัน ก่อนว่าทุกๆ Perspective ยังเข้าใช้งานได้อยู่ไม่มีปัญหา ค่อยลบออกได้ครับ

* ผมแนะนำว่าควรใช้วิธีโหลดตัว Update มาลงที่เครื่องแล้ว Update เอาน่ะครับ จะง่ายกว่า แล้วไม่ค่อยจะจเอปัญหาเท่าไร โดย Update ตัว RPU(Rational Product Updater) ก่อน สามารทำผ่าน ตัว Update ได้เลยหรือโหลดก็ได้ครับ ตัวเล็กนิดเดียว เสร็จแล้วก็ สั่ง Update อีกทีว่ามีตัวอะไรบ้าง แล้ว Copy ชื่อไปหาใน Google ได้เลยครับ จะเจอลิงค์ Download เองเลยครับ แล้วก็โหลดเอา


ความแตกต่างระหว่าง ConnectionTimeOut กับ ReadTimeOut

เป็นการ Config ของ HTTPURLConnection(JDK1.5) หรือ Socket เพราะบางทีผมเห็นว่าบางคนยังไม่ค่อยเข้าใจ ผมเลยเอามาเขียนให้รู้เื่รื่องกัน อันนี้ตามความเข้าใจของผมนะครับ ถ้าผิดพลาดประการใด ก็ขอโทษด้วยครับ
  • ConnectionTimeOut จะเป็นการ Config ว่า Connection ที่ติดต่อไปยัง Server สามารถอยู่ได้นานขนาดไหน ถ้าจะให้เห็นภาพ คือ ถ้าสมมติเรา Connect ไปแล้ว แต่ทางฝั่งนู้นไม่ได้เปิดเครื่องไว้ (Ping แล้ว TimeOut) เวลาที่รอจะเท่ากับที่ ConnectionTimeOut ที่เราตั้งไว้น่ะครับ (จะไม่สามารถตั้งเกิน Default ของ Server)
  • ReadTimeOut จะเป็นการที่เราสามารถติดต่อทางฝั่ง Server ได้แล้ว แต่เวลาที่มันตอบกลับมาช้ากว่าเวลาที่เราตั้งไว้ จะต่างกับ ConnectionTimeOut ตรงที่ว่า ReadTimeOut จะรู้ว่าเครื่อง Server ที่เราติดต่อนั้นยังอยู่ แต่ตอบกลับมาช้ากว่าที่เรากำหนดไว้น่ะครับ
เพราะฉะนั้น เราควรจะตั้งไว้ทั้งสองแบบในการ Config Connection เพราะเราไม่รู้แน่ว่า Server ที่เราติดต่อไปจะเกิดกรณีไหน

วันศุกร์ที่ 21 มีนาคม พ.ศ. 2551

วิธีการ Stop, Start Websphere 6.1 ผ่าน Command Line

เป็นวิธีการ Stop, Start Websphere Application Server 6.0-6.1 น่ะครับ ทำบน Unix ผ่าน Command Line ถ้าทำบน Windows ผมว่าน่าจะง่ายกว่าน่ะครับ หลัการง่ายๆ ก็ดังนี้

สำหรับ Start Server
  1. เราต้องไป Start Manager ก่อน (ซึ้งถ้าเรา Start เสร็จเราจะได้หน้า Admin Console มาครับ) โดยจะอยู่ที่ .../IBM/Websphere/AppServer/bin ครับ จะชื่อ startManager (ใช้คำสั่ง ./startMAnager.sh)
  2. ต่อไปเราจะมา Start Node ให้เข้าไปที่ Node ที่เราต้องการ โดยจะอยู่ที่ .../IBM/Websphere/AppServer/profiles/[Node]/bin จะชื่อ startNode.sh
  3. พอเสร็จแล้วเราสามารถไป Start Server ได้ที่ หน้า Admin Console ได้เลยครับ หรือถ้าจะใช้ Command ก็สามารถทำได้ที่ เดียวกับ Node เลยครับ จะชื่อ startServer.sh ครับ
สำหรับ Stop Server
  1. ใช้หลักการเดียวกันเลยครับ แต่เปลี่ยนคำสั่งเป็น stopXXX.sh
  2. ดยจะต้องย้อนกลับขึ้นไปแทนโดยเริ่มที่ Server ก่อนแล้วย้อนขึ้นไปเรื่อยๆ น่ะครับ

วันศุกร์ที่ 15 กุมภาพันธ์ พ.ศ. 2551

การหาอักขระ สำหรับขึ้นบรรทัดใหม่

โดยปกติ แล้วระว่าง Windows, Linux จะเป็นคนละตัวกันน่ะครับ
ผมเลยใช้วิธีนี้แทน

System.getProperty("line.separator");

จะได้ข้อมูลว่า System นั้น ตกบรรทัดเป้นอะไรน่ะครับ

วันอังคารที่ 29 มกราคม พ.ศ. 2551

Config Object Cache Instances [On Websphere 6.0-6.1]

ใช้ Cache ของ Websphere น่ะครับ โดยเราจะต้องเอาค่าเข้าไปเก็บ แล้วเรียกขึ้นมาอีกทีนึงน่ะครับ

1. Object cache instances จะอยู่ที่ Resources --> Cache instances
2. เลือก New จะได้หน้าจอแบบนี้



3. แล้วก็ใน Name กับ JNDI Name (เป็นชื้อที่เราใช้เรียกจาก Project น่ัะครับ)
4. จะใช้งานได้แล้ว โดยเราจะต้องทำ Resource Reference ใน Project(Web Projectm EJB Project) ที่เราใช้เรียก โดยเป็น com.ibm.websphere.cache.DistributedMap น่ะครับ
5. ใช้งานแบบ Map เลย Put ค่าลงไปก่อนจะใช้ก็ Get เอา

วันศุกร์ที่ 25 มกราคม พ.ศ. 2551

วิธีการใช้งาน Ethereal เบื้องต้น

Ethereal เป็น โปรแกรมที่ไว้ดักจับข้อมูลใน Network ที่ผ่านเข้าออกจากเครื่องเราน่ะครับ บางทีพอเวลาเราเขียนโปรแกรมที่ต้องติดต่อกับระบบข้างนอก (เช่น การใช้ Web Service, XML Over HTTP) เราส่งข้อมูลไปครบ แต่ทำไมส่งไปฝั่งนู้นไม่ครบ ทำให้บางทีเราต้องมาตรวจสอบ Package ว่าข้อมูลที่ส่งไปจริงๆ ถูกหรือเปล่าน่ะครับ โหลดได้จาก ที่นี่ (ซึ่งเวลาเรา Install ให้เลือก Install WinPCap ด้วยนะครับ)

รูปหน้าตาโปรแกรมครับ



วิธีการใช้งานเบื้องต้น
1. เลือกว่าเราจะจับข้อมูลทางช่องทางไหน โดยดูที่ Capture --> Interfaces...
2. พอกดไปแล้ว มันจะให้เลือก ก็เลือกที่เราต้องการ (ดูง่ายๆ อันที่มีข้อมูลวิ่งน่ะครับ ก็เลือกอันนั้นเอา)
3. กด Capture เลย แล้วก็ Run Programmes ของเรา พอเสร็จก็กด Stop ก็จะได้ข้อมูลแล้วครับ แล้วก็ดูใน Package เอาก็จะรู้แล้วว่าข้อมูลที่ส่งไปถูกหรือไม่

ปล.
1. Filter ง่ายๆ ip.addr = IP ที่เราต้องการ
2. ถ้าจะดูข้อมูลคลิกขวาที่ Package แล้วเลือก Follow TCP Stream ก็จะเห็นข้อมูลที่เราส่งไปครับ

วันพฤหัสบดีที่ 24 มกราคม พ.ศ. 2551

ปัญหาการ Deploy บน Websphere 6.0 - 6.1

ปัญหาส่วนใหญ่ต้องดู SystemOut.log เอาน่ะครับ อันนี้เป็น Guidline คร่าวๆ เท่านั้น

1. ถ้าเคย Deploy แล้วได้ แต่อยู่ดีๆ พอ Deploy ใหม่แล้วไม่ได้ ลอง Export Ear File ใหม่แล้ว Deploy อีกที อาจจเป็นเพราะเวลาเรา Export มามีปัญหาน่ะครับ ลองทำซ้ำดู ก็จะได้

2. ถ้า Deploy สำเร็จ แต่ Start Application ไม่ได้ อันนี้ต้องตรวจสอบดีๆ ว่าเป็นที่อะไรน่ะครับ
  • ลองดูว่า Duplication EJB Name หรือเปล่าครับ ถ้าใช้ ก็เปลี่ยนชื่อไม่ให้ซ้ำกัน
  • Deploy EJB Project หรือยังก่อนที่จะ Export Ear File มันก็จะทำให้มีปัญหาเหมือนกัน
  • เป็นที่ Ear Project หรือเปล่า ลองตรวจดูว่า มี Web Module หรือ Module ไหนหรือเปล่าที่ Doesn't exist ใน Ear Project (เกิดกรณีที่เราเปลี่ยนชื่อ หรือลบมันทิ้งน่ะครับ)
  • ถ้ามีการเปลี่ยนชื่อ Project หรืออะไรต้องทำการ Remove ออกก่อนแล้ว Add ใหม่ ถ้าไม่ทำอาจจะทำให้ Deploy Application ไม่ได้น่ะครับ
3. ปัญหา Application ยาวเกิน 259 ตัวอักษร (เกิดใน Windows ผมไม่แน่ใจว่าบน Unix จะเป็นเปล่านะครับ) ให้เปลี่ยนชื่อ Application Exception จะประมาณ xxx too long น่ะครับ แก้ได้ดังนี้
  • ถ้าสามารถเปลี่ยนชื่อ Application ได้ก็ให้เปลี่ยนให้สั้นลงนะครับ
  • ถ้าเป็นที่ WSDL File ให้ลบทิ้ง (ปกติมันจะ Generate WSDL File มาสองที่ ที่อยู่ในลึกมากๆ หลาย Folder อันนี้ให้ลบทิ้งได้เลยครับ ส่วนที่อยู่ใน web-inf/wsdl ไม่ต้องลบครับ)
  • ถ้าทำตามข้างบนไม่ได้ให้ Create Profile ใหม่แล้วเอา Application ไปไว้ที่ตัวใหม่แทนน่ะครับ ดูวิธี Create ได้ ที่นี่

4. อันนี้สำคัญมาก ถ้าเรา Deploy Ear File ของเิิดิม โดยเปลี่ยนชื่อเป็นตัวใหม่ พยายามแก้ JNDI Name (EJB) ทั้งหมด อย่าให้ซ้ำ เพราะจะทำให้ทุก Application ที่ Deploy อยู่บน Server ใช้งานไม่ได้ ต้อง Unistall แล้ว Deploy ใหม่ทั้งหมด (ดูจาก ใน Directory installedApp จะไม่มี ข้อมูลอยู่เลย) แต่สามารถ Export ข้อมูลออกมาได้ คือ Export แล้ว Uninstall แล้วเอาตัวที่ Export มา Deploy ใหม่น่ะครับ

วันศุกร์ที่ 11 มกราคม พ.ศ. 2551

วิธีการแก้ไขปัญหาเมื่อเราไม่เจอ Class ที่เราไปเรียก On Rad 6.0

ไว้ตรวจสอบเวลาเราเล่น Application แล้วหา Class ไม่เจอน่ะครับ (Class Not found) นะครับ
1. ตรวจสอบดูที่ Ear Project (application.xml file) โดยดูดังนี้
  • ที่ Tab Deployment ตรงส่วนของ Application ให้ตรง WAR classloader policy : เป็น APPLICATION (default จะเป็น MODULE)
  • ถ้าเป็น Error จาก Class จาก Jar File ที่เพิ่มเข้ามาแบบ Add External JARS จะต้องมาเพิ่ม Library ที่ Shared Library ใน Tab Deployment ด้วย โดยจะ Add เป็น Path ของ Jar นั้นได้เลยครับ ดังรูป
  • ถ้า Class เป็นของ Java Application ที่เราทำไว้ ให้ไปดูที่ Tab Module ให้ Add ตรงที่ Project Utility JARs ครับ
  • ถ้า Class เป็นของ Web Project, EJB Project เอามาใช้สามาถ Add ได้ที่ส่วนของ Module ใน Tab Module ครับ
2. ต่อไปตรวจสอบที่ Java JAR Dependencies (โดยคลิกขวาที่ Project แล้วเลือก Properties แล้วจะมี อันนี้อยู่ครับ) ว่ามีการคลิก Project ที่เราต้องการหรือยัง (อะไรไปเรียกอะไร ก็ Config ที่ Project ที่เรียกนั้นครับ)

หมายเหตุ
  • อย่าใช้ชื่อ Class เดียวกัน Package เีดียวกัน แต่อยู่คนละ Project นะครับ เพราะ โปรแกรมจะไม่รู้ว่าดึงตัวไหนไปใช้ ทำให้สับสนได้ครับ

วิธีการแก้ไขปัญหาเมื่อเราไม่เจอ JNDI Name On RAD 6.0

เป็นวิธีการดูเป็น Step น่ะครับ ว่าควรจะตรวจสอบอะไรบ้าง ถ้ามันมีปัญหา Exception JNDI Name Not found. น่ะครับ โดย ทำดังนี้

1. ต้องตรวจสอบก่อนว่าอันไหนไปเรียก JNDI Name ตัวนั้น (Web Project, EJB Project, Project Client)
  • วิธีการตรวจสอบนั้นให้ตรวจสอบจาก SystemOut.log ดูที่เป็น Error จาก Package ของเราแล้วดูลงไปเรื่อยๆ ก็จะรู้ว่ามาจากตัวไหน
2. หลังจากนั้นก็ไปดูที่ Reference ของตัวที่เรียกว่ามีการสร้างไว้หรือยัง โดย

  • ถ้าไปเรียก EJB จะมี Config สองส่วน (อยู่ใน XML File ที่ Tab Reference)ดังรูป



    • จากรูป Name ข้างบนจะเป็น JNDI Name ที่เราใช้เรียกใน Project นั้นครับ ตรวจสอบดูว่าเขียนชื่อถูกหรือเปล่า
    • อันล่างตรง WebSphere Binding ตรงนี้คือ JNDI Name ที่ไปเรียกที่ Websphere ชื่ออะไร คือ JNDI Name ที่อยู่ใน EJB Project นั่นล่ะครับ (โดยปกติเราจะไม่ต้อง Config อันนี้จะดึงค่าจาก JNDI Name ใน EJB Project ให้เลยน่ะครับ ยกเว้นกรณีที่เรามีการแก้ไข JNDI Name ที่ EJB Project มันจะไม่ Auto แก้ให้ต้องมาแก้ไขเองน่ะครับ)

  • ถ้าไปเรียกอย่างอื่น เช่น Datasource ก็มี Config สองส่วนเหมือนกัน ดังรูป


    • ส่วนบนก็ชื่อที่เราใช้เรียกใน Project ของเรา
    • อันล่างตรง WEbsphere Binding ตรงนี้เป็นที่เราไปเรียก JNDI Name ที่ Server ครับ (อันนี้เราต้องเขียนค่าลงไปเองครับ ไม่มี Default ค่าให้)

3. หลังจากตรวจดูจากข้อสอง เสร็จแล้ว
  • ถ้าเป็น Web Project ให้ Save แล้ว Restart Application ถึงจะใช้งานได้ครับ
  • ถ้าเป็น EJB Project ให้ Deploy EJB แล้วก็จะใช้งานได้ครับ
4. หลังจากทำเสร็จแล้วควรจะไม่มีปัญหา JNDI Name Not Found แล้วนะครับ


หมายเหตุ
  • สำหรับ EJB ไปเรียก EJB ด้วยกัน ใน EJB Project เดียวกันก็ต้อง Config Reference เหมือนกันนะครับ ถึงจะเห็น
  • ทุกครั้งที่ Config พวกนี้ ถ้าเป็น EJB ต้อง Deploy ใหม่ทุกครับ สำหรับ Web Project ตั้อง Restart Application ทุกครั้ง

วันพุธที่ 9 มกราคม พ.ศ. 2551

Step By Step Create Entity Bean By Rad 6.0

1. Create EJB Project ขึ้นมาก่อน
2. สร้าง Map-Relationship โดยคลิกขวาที่ EJB Project เลือก EJB to RDB Mapping จะขึ้นหน้าต่างดังรูป


3. ทำการเลือก Create a new backend folder (กรณีที่ยังไม่ได้ทำไว้น่ะครับ ถ้าทำไว้แล้วจะมีอยู่แล้ว) แล้ว กด Next
4. เลือก Bottom-Up (ถ้าสร้างครั้งแรกก็มีให้เลือกอยู่อันเดียวอยู่แล้วครับ) แล้วกด Next
5. จะขึ้นหน้าต่างดังภาพ (ซึ่งจะเป็นการ Config DB ครับ ข้างล่างผม Config ให้ใช้กับ Oracle น่ะครับ)


6. หลังจากกด Next แล้ว จะให้เราเลือกว่าจะเอา Table ไหนบ้าง ก็เลือกที่เราต้องการได้เลยครับ แล้วกด Finish ได้เลย
7. เสร็จแล้วก็ คลิกขวา Deploy EJB ก็จะใช้งานได้แล้วครับ
8. วิธีเรียกก็เหมือนเรียก EJB ปกติครับ

หมายเหตุ
1. บางทีเราอาจจะต้อง add JNDI - CMP Connection Factory Binding ครับ คือ เป็นการ Add Adtasource Reference เข้ากับที่ Server Config ไว้น่ะครับ (สร้างเป็น XA Datasource)
2. ถ้าเราอยากเพิ่มให้ Add เป็น Model ได้ให้เพิ่ม create ที่รับเป็น Model ได้เลยครับ โดย
  1. เพิ่มที่ xxxLocalHome รับ Model ที่ต้องการ
  2. เพิ่มที่ xxxBean โดยต้องเพิ่มสองเมธอด คือ ejbCreate, ejbPostCreate
  3. เพิ่มการ set ค่าลงไปใน ejbCreate แต่ใน ejbPostCreate ไม่ต้องทำอะไรครับ

EJB Life Cycle

จดไว้เตือนความจำครับ

1. Statefull Session Bean
  1. เมื่อไม่มี --> create --> SetSessionContext --> ready --> ejbRemove --> Remove
  2. เมื่อไม่ได้ใช้งานนานๆ --> ejbPassivate จะใช้ก็ --> ejbActivate
2. Stateless Session Bean
  1. ทุกครั้งจะ create --> SetSessionContext --> ejbRemove --> Remove
3. Entity Bean
  1. ทำการ Set EntityContext --> ลง Pool --> create --> ejbCreate --> ejbPostCreate --> ready
  2. ถ้าไม่ได้ใช้เก็บลง Pool โดย ejbPassivate ถ้าจะใช้ก็ ejbActivate
  3. เมื่อยกเลิกจะไป remove --> ejbRemove --> ลง Pool --> unsetEntityContext
4. Message Driven Bean
  1. เมื่อไม่มี setMessageDrivenContext --> ready (onMessage) --> ejbRemove
อันนี้คร่าวๆ ที่จริมีละเอียดกว่านี้ ต้องอ่านตาม Reference เอาครับ อันนี้ผมจดไว้จะเขียน Process เพื่อ Handle อ่ะครับ


Reference
- http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts9.html
- http://www.leocrawford.org.uk/work/jcea/part1/ejbcontainer.html

วันอังคารที่ 8 มกราคม พ.ศ. 2551

Config Hibernate ให้ใช้บน RAD 6.0 + Oracle แบบ EJB

วิธีนี้จะดีกว่าวิธีที่กลาวมก่อนแล้ว เพราะให้ EJB ควบคุม Transaction นะครับ เราไม่จำเป็นต้องเปิด ปิด มัน มันจะ ปิดให้เองโดย EJB ครับ ทำได้ดังนี้

1. ต้องเปลี่ยนเป็นใช้ .getCurrentSession() แทน openSession() ครับ ตอนเราเรียก Session มาใช้งาน
2. แก้ hibernate.cfg.xml เพื่อบอกมันว่าจะใช้ Transaction ซึ่งแต่ละ Server จะเรียกคนละชื่อกันครับ ต้องดูเอา (ผมเคยลอง Test MySQL กับ Websphere 6.0 แล้ว ใช้งานไม่ได้ครับ)

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>

อันนี้เป็นของ Websphere Server 6.x นะครับ ถึงจะใช้งานได้

3. แล้วเราก็จะใช้งานได้แล้ว

หมายเหตุ
1. วิธีแบบนี้มีข้อเสียคือ ต้องทำผ่าน EJB เสมอไม่ว่าจะเป็น การ Select ค่าก็ตาม
2. ต้องพยายามทำบน EJB ตัวเดียวกัน เพราะ ถ้าทำคนละตัวอาจจะมีการเรียก Insert, Update ผิดพลาดได้

Config Hibernate ให้ใช้บน RAD 6.0 + Oracle แบบธรรมดา

อันนี้เป็นแบบธรรมดา ไม่ได้ใช้ Transaction ของ Websphere ในการควบคุม (แบบนี้สามารถไปใช้ บนEclipse ได้ด้วย และ Server ไหนก็ได้ครับ) และผมใช้ Datasource ด้วย
1. สร้าง Project ขึ้นมาก่อน (Web Project + Ear Project)
2. โหลด Hibernate ที่นี่ (ที่ผมใช้เป็น Hibernate 3.2 ครับ)
3. Copy Library มาใส่ที่ Project ของเรา หรือจะทำการ Add Share Library ใน Ear Project ก็ได้
4. ทำการ สร้าง HibernateUtil ขึ้นมาเพื่อเรียกใช้งาน (โดย Copy File จาก Tutorial มาใช้ได้เลยครับ)

private static final SessionFactory sessionFactory;

static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure("WEB-INF/hibernate.cfg.xml").buildSessionFactory(); //อันนี้ผมอ้างที่อยู่ของ File Config ว่าอยู่ที่ไหน
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;// ที่เราจะเอาไปใช้งาน
}

5. ต่อไปก็สร้าง hibernate.cfg.xml ซึ่งไว้สำหรับ Config ของ Hibernate

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- Database connection settings -->

<property name="hibernate.connection.datasource">jdbc/spag</property> //Config Datasource ที่เราใช้งาน

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>

<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> //เลือกเป็น Oracle 9i

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<mapping resource="com/test/hibernate/model/GeneralParamM.hbm.xml"/> //Config Table ที่เราใช้งาน

</session-factory>

</hibernate-configuration>

6. ต่อไปเราสร้าง Config ของ Table โดยผมจะสร้างไว้ที่ com.test.hibernate.model ครับชื่อ ไฟล์ GeneralParamM.hbm.xml ซึ่งพวกนี้ผม Config ไว้ใน hibernate.cfg.xml ตามบรรทัดข้างล่างสุด


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>


<class name="com.test.hibernate.model.GeneralParamM" table="GENERAL_PARAM"> //บอกว่าใช้ Class ไหน Mapping กับ Table ไหน
<id name="paramCode" column="PARAM_CODE"> //บอกว่าเป็น Primary Key
<generator class="assigned"/>//บอกว่าใช้แบบ Assign ค่าลงไปเอง
</id>
<property name="paramValue" column="PARAM_VALUE"/>
<property name="labelName" column="LABEL_NAME"/>
<property name="editableFlag" column="EDITABLE_FLAG"/>
</class>


</hibernate-mapping>

7. พอสร้างทั้งหมดเสร็จแล้ว เราก็มาลองเรียกมันดูโดย


SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session sessionHibernate = sessionFactory.openSession(); //เปิด Session ไว้ใช้งาน
Criteria criteria = sessionHibernate.createCriteria(GeneralParamM.class);
criteria.add(Restrictions.eq("paramCode",)); //ใส่ค่าที่เราต้องการหา

List result = criteria.list();

sessionFactory.close(); //ปิด Session จำเป็นต้องปิทุกครั้งนะครับ

8. พอสั่งรันเสร็จ มันก็จะดึงค่าจาก Table ขึ้นมาให้ครับ (ตรวจสอบ SystemOut.log ด้วยว่า Error หรือเปล่า) อันนี้เป็ฯแบบง่ายๆ นะครับ

หมายเหต
1. อาจจะมีปัญหาพอดึงค่าแล้วสั่งปิด ไปค่าที่ได้ไม่มาเกิด Exception นะครับ
2. ถ้าใช้วิธีนี้จะต้องปิดทุกครั้งที่เลิกใช้งาน ไม่งั้น Session จะค้าง

วันจันทร์ที่ 7 มกราคม พ.ศ. 2551

การเรียก Web Service ผ่าน Java ที่เราทำการ Generate แล้ว

วีธีในการเรียกนั้ เราสามารถที่จะเรียกผ่าน Proxy หรือ Locator ก็ได้ครับ ทำไ้ดัดังนี้

1. วิธีการเรียกผ่าน Proxy ทำดังนี้

xxxProxy proxy = xxxProxy();
proxy.setEndpoint(endpoint); //ไว้สำหรับ Set URL ของ Web Service ที่เราจะไปเรียก
proxy.process(); //เรียก Process ที่เราต้องการใช้ใน Web Service นั้น


2. เรียกผ่าน Locator ดังนี้

xxxLocator locator = new xxxLocator(); //เรียก Service Locator
xxx service = locator.getxxx(new URL("endpoint")); //เรียก Service ที่เราใช้งาน คล้ายๆ Proxy แล้ว Set URL ที่เราต้องไปเรียก
service.process(); // เรียก Process ที่เราต้องการใช้ใน Web Service นั้น

Step By Step Generate Web Service Client By Eclipse 3.3

Step By Step Generate Web Service Client By Eclipse 3.3
เป็นวิธีการสร้าง Web Service Client ไปเรียก Web Service ในกรณีที่เรามี WSDL File อยู่แล้วนะครับ

1. ขั้นแรกโหลด Eclipse 3.3 มาก่อนโหลด ที่นี่ โหลดที่เป็นสำหรับ Java EE Developers
  • สำหรับ Eclipse 3.3 จะต้องมี JRE 1.5 ขึ้นไปครับ ต้องโหลดมาลงด้วย
2. ต่อไปเรามาสร้าง Project กัน โดยผมจะสร้างเป็น Java Project โดยคลิกขวาเลือก New --> Project ดังรูป

3. เลือก Folder ที่เป็น Java จากนั้นเลือก Java Project คลิก Next จะได้หน้าต่างดังรูป


4. จากนั้นก็พิมพ์ชื่อ Project Name ลงไป (ตรวจสอบตรงช่อง JRE ว่ามี JRE หรือเปล่า ถ้าไม่มีให้ไป คลิกที่ Configuration Default) โดย
  1. เมื่อกดเข้าไปแล้ว จะได้ดังรูป

  2. ให้ทำการ Add JRE ตรงปุ่ม Add ด้านขวามือ แล้วไปหา Folder ที่เรา Install JRE ไว้ (โดยปกติจะอยู่ที่ Program Files/Java ครับ)
  3. เมื่อ Add แล้วให้ติกเครื่องหมายถูก ก็จะได้ JRE เป็น Default ของ Eclipse แล้ว
5. หลังจากคลิก FInish แล้วจะได้ Java Project มา แล้วเราก็เอา WSDL File มาวางไว้ที่ Project
6. คลิก ขวาที่ WSDL File เลือก Web Services --> Generate Client ดังรูป

7. เมื่อเลือกแล้ว จะขึ้นหน้าต่างดังรูป (ควรตรวจสอบ Web Service Runtime ให้เป็น Apache Axis กับ Client Project เป็น Java Project ที่เราสร้างไว้ และ Client Type เป็น Java Proxy)
8. คลิก Finish ได้เลย เราจะได้ Web Service Client มาไว้ใช้งานแล้ว
9. Entry ต่อไปจะเขียนวิธีการเรียกโดยใช้ File พวกนี้ครับ ดู ที่นี่

หมายเหตุ สำหรับจะเอาไปใช้กับ Java Editor ตัวอื่นให้ Copy เฉพาะ Java File ไปใช้ ก็จะใช้งานได้เลยครับเช่น บน RAD 6.0 ก็ Copy ไปใช้งานได้เลย (แ่ต่เอามา Generate Sample JSP ไม่ได้ครับ ต้องใช้ของ RAD เอง ถึงจทำได้ครับ)