在你的應用程序中利用IBM WebSphere MQ消息中間件提供Java消息服務開放接口
IBM WebSphere MQ(WMQ)是一套面向消息的中間件(messageoriented middlewareMOM)通過使用消息和隊列簡化應用程序之間的通信WMQ支持點到點的和發布/訂閱消息支持多種平台包括WindowsAIXHPUX和Sun Solaris它特別適合目前的異構計算環境
對於Java開發者而言WMQ為Java應用程序提供了兩種接口
為Java提供MQ基礎類 一個基於WMQ本地接口的Java接口
MQ JMS Java消息服務(Java Messaging Service JMS)接口的實現
JMS通過開啟Java應用程序發送和接收消息擴展了Java的互操作性JMS應用程序可以使用點到點或發布/訂閱模式進行消息交換
本文描述的是使用WMQ和JMS進行開發的過程重心集中在點到點消息通過下面幾步教你如何使用Java類編寫JMS接口
創建WMQ對象
創建JMS管理對象
解釋JMS代碼
運行一個實例類發送消息和從WMQ接收消息
WMQ安裝
本文使用的是winxp上的MQ 版本 (可以從下載試用版)在windows上的安裝是非常簡單的一路默認就可以完成安裝
如果你還沒有使用過WMQ也不要擔心你可以使用基於Eclipse的WebSphere MQ管理器它是一個簡單的用於管理WMQ的圖形工具
創建MQ對象隊列管理器和隊列
隊列是用來存儲 target=_blank>存儲消息的直到應用程序處理完畢才釋放隊列管理器擁有並管理隊列要創建一個隊列管理器和隊列按以下步驟啟動WebSphere MQ管理器開始?所有程序? IBM WebSphere MQ ? WebSphere MQ Explorer圖顯示了啟動WebSphere MQ管理器時的樣子
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 WebSphere MQ 管理器
在MQ管理器中執行下列操作創建一個隊列管理器
在導航視圖下右擊隊列管理器選擇新建隊列管理器啟動創建隊列管理器向導
在第一步中輸入隊列管理器的名字TestMQ點擊下一步如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 創建隊列管理器第一步輸入隊列管理器名稱
在第二步和第三步都點擊下一步進入第四步確定選中了創建一個TCP/IP監聽器然後輸入一個未使用的端口號點擊完成如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 創建隊列管理器第四步檢查隊列管理器的監聽器端口號
接下來創建兩個隊列INQUEUE 和 OUTQUEUE你就可以將消息寫入INQUEUE從OUTQUEUE讀取消息
在TestMQ下右擊隊列?新建?本地隊列啟動新建本地隊列向導
在名稱區域輸入INQUEUE點擊完成如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 創建隊列向導輸入隊列名稱其它屬性值保留默認值
重復上面的步驟創建好隊列OUTQUEUE
創建JMS管理對象
JMS定義了一個通用的接口來發送和接收消息只要與之通信的程序兼容JMS即可點到點的JMS接口是
javaxjmsQueueConnection 這個接口提供一個到JMS提供程序的連接用於創建會話對象
javaxjmsQueueSession 這個接口為產生和消耗消息提供上下文呢包括創建QueueSender和QueueReceiver的方法
javaxjmsQueueSender 這個接口用於向隊列發送消息javaxjmsQueueReceiver用於從隊列接收消息
為了讓你的代碼可以在不同的消息提供程序間有良好的移植性你必須在你的應用程序中使用javaxjms中的標准JMS接口所有特定廠家的信息都封裝在javaxjmsQueueConnectionFactory 和 javaxjmsQueue中這些管理對象可以使用廠家提供管理工具進行構建存儲在JNDI命名空間中JMS應用程序可以從命名空間中檢索這些對象這時就不需要知道是哪個廠家提供的了
按照下面的步驟使用Websphere MQ管理器創建管理對象存儲在基於文件的目錄下
在JMS管理對象上點擊右鍵?添加初始上下文
在屏幕上
為JNDI存儲在哪裡選擇文件系統
在關聯目錄處輸入C:\JNDIDirectory(前提是這個目錄已經存在)
注意工廠類和提供程序URL因為你將會在Java代碼中使用到(如圖所示)
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 添加初始上下文向導你將在樣例類中使用工廠類和提供程序URL
你的管理器現在應該如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 添加初始上下文後的MQ管理器你可以在MQ管理器中輕易地創建JMS管理對象
在新的初始上下文中創建一個連接工廠
在連接工廠上點擊右鍵?新建?連接工廠在第一個屏幕上在名稱區域輸入TestQM_QCF點擊下一步在JNDI查找中你就使用TestQM_QCF了
將類型設置為隊列連接工廠點擊下一步如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 新建連接工廠向導用於點對點消息的隊列連接工廠
保持傳送類型為匯集點擊下一步當WMQ和應用程序在同一機器上時使用匯集傳輸
在下一頁面點擊下一步(無需修改設置)
在最後一頁選擇連接標簽點擊選擇按鈕選擇TestQM作為基礎隊列管理器如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 新建連接工廠向導連接工廠被包裝為TestMQ
點擊完成
接下來創建目的地對應WMQ消息的JMS管理對象
在目的地上點擊右鍵?選擇新建?目的地
在第一頁上在名字區域輸入INInputTestQueue作為名字確保類型設置為隊列了點擊下一步如圖所示
src=http://imgeducitycn/img_///jpg border= twffan=done>
圖 新建目的地向導使用InputTestQueue查找INQUEUE
第二頁保持默認設置不變點擊下一步
在最後一頁
在隊列管理器區域點擊選擇按鈕選擇TestQM
在隊列區域點擊選擇按鈕選擇INQUEUE
點擊完成
重復上述步驟創建另一個目的地OutputTestQueue它對應OUTQUEUE
理解示例類
如果你編寫過JMS應用程序就很容易理解JNDIUtil 和 Tester示例類(從_JMSSource&Classeszip下載Java源文件和編譯好的類)你創建的JMS管理對象隱藏了所有廠家專利實現
JNDIUtil類
JNDIUtil包括使用名字通過JNDI查找檢索對象的方法參考清單你可以使用這個類中的方法檢索你在MQ管理器中定義的JMS對象的引用情況
清單 JNDIUtiljava
Code highlighting produced by Actipro CodeHighlighter (freeware)
>package devx
articles
mqjms;
// JMS 類
import javax
jms
JMSException;
import javax
jms
Queue;
import javax
jms
QueueConnectionFactory;
// JNDI 類
import javax
naming
InitialContext;
import javax
naming
Context;
import javax
naming
NamingException;
// 標准 Java類
import java
util
Hashtable;
/**
*
* A wrapper class for JNDI calls
*
*/
public class JNDIUtil
{
private Context context;
public JNDIUtil(String icf
String url) throws JMSException
NamingException
{
Hashtable environment = new Hashtable();
environment
put(Context
INITIAL_CONTEXT_FACTORY
icf );
environment
put(Context
PROVIDER_URL
url);
context= new InitialContext( environment );
}
/**
*
* @param ObjName Object Name to be retrieved
* @return Retrieved Object
* @throws NamingException
*/
private Object getObjectByName(String ObjName) throws NamingException
{
return context
lookup( ObjName );
}
/**
* A convenience method that returns QueueConnectionFactory objects (no casting required)
* @param factoryName QueueConnectionFactory JNDI name
* @return QueueConnectionFactory object
* @throws NamingException
*/
public QueueConnectionFactory getQueueConnectionFactory(String factoryName) throws NamingException
{
return (QueueConnectionFactory) getObjectByName(factoryName);
}
/**
* A convenience method that returns Queue objects (no casting required)
* @param queueName
* @return
* @throws NamingException
*/
public Queue getQueue(String queueName) throws NamingException
{
return (Queue) getObjectByName(queueName);
}
}
Tester類
Tester類向OUTQUEUE中寫入消息從INQUEUE中讀取消息參考清單
清單 Testerjava
Code highlighting produced by Actipro CodeHighlighter (freeware)
> package devx
articles
mqjms;
//JMS 類
import javax
jms
Queue;
import javax
jms
QueueSession;
import javax
jms
QueueConnection;
import javax
jms
QueueConnectionFactory;
import javax
jms
JMSException;
import javax
jms
Session;
import javax
jms
QueueSender;
import javax
jms
QueueReceiver;
import javax
jms
TextMessage;
import javax
jms
Message;
//JNDI 類
import javax
naming
NamingException;
//標准 Java 類
/**
*
* A class to test JMS with IBM MQ
*
*/
public class Tester
{
public static String icf =
com
sun
jndi
fscontext
RefFSContextFactory
;
public static String url =
file:/C:/JNDI
Directory
;
public static void main(String[] vars) throws JMSException
NamingException
{
QueueSession session = null;
QueueConnection connection = null;
QueueConnectionFactory factory = null;
QueueSender queueSender = null;
QueueReceiver queueReceiver= null;
Queue oQueue = null; // 消息發送到的隊列
Queue iQueue = null; // 接收消息的隊列
try
{
JNDIUtil jndiUtil= new JNDIUtil(icf
url);
factory= jndiUtil
getQueueConnectionFactory(
TestQM_QCF
);
connection = factory
createQueueConnection();
// 啟動(或重新啟動)入站消息的連接地址
如果沒有這個調用消息不會被接收
connection
start();
//表示一個非相互操作會話
boolean transacted = false;
session = connection
createQueueSession( transacted
Session
AUTO_ACKNOWLEDGE);
oQueue= jndiUtil
getQueue(
OutputTestQueue
);
queueSender = session
createSender(oQueue);
TextMessage oMsg = session
createTextMessage();
oMsg
setText(
);
// 你還可以設置其他消息屬性
queueSender
send(oMsg);
iQueue= jndiUtil
getQueue(
InputTestQueue
);
queueReceiver = session
createReceiver(iQueue);
Message iMsg = queueReceiver
receive(
);
if ( iMsg != null )
System
out
println( ((TextMessage)iMsg)
getText() );
else
System
out
println(
No messages in queue
);
}
finally
{
//總是釋放資源
if ( queueReceiver!= null )
queueReceiver
close();
if ( queueSender!= null )
queueSender
close();
if ( session!= null )
session
close();
if ( connection!= null )
{
connection
close();
}
}
}
}
開始點是連接工廠查找這個工廠用於創建一個連接
Code highlighting produced by Actipro CodeHighlighter (freeware)
>factory= jndiUtil
getQueueConnectionFactory(
TestQM_QCF
);
connection = factory
createQueueConnection();
連接對象用於創建一個會話
Code highlighting produced by Actipro CodeHighlighter (freeware)
> session = connection
createQueueSession( transacted
Session
AUTO_ACKNOWLEDGE);
要將消息寫入INQUEUE queue查找前面創建的目的地對象OutputTestQueue
Code highlighting produced by Actipro CodeHighlighter (freeware)
>oQueue= jndiUtil
getQueue(
OutputTestQueue
);
最後創建一個QueueSender對象將消息寫入隊列
Code highlighting produced by Actipro CodeHighlighter (freeware)
>queueSender = session
createSender(oQueue);
TextMessage oMsg = session
createTextMessage();
oMsg
setText(
);
queueSender
send(oMsg);
從OUTQUEUE讀取消息的過程相同但使用的是QueueReceiver
編譯運行示例類
當你安裝WMQ時會自動將編譯和運行示例類需要的jar文件添加到CLASSPATH環境變量中需要的jar文件位於C:\Program Files\IBM\WebSphere MQ\Java\lib包括JMS和JNDI需要的jar
在運行Tester類之前使用MQ管理器向INQUEUE增加一條測試消息
在 INQUEUE上點擊右鍵選擇放入測試消息
輸入任意文本點擊放入消息
如果你還沒有在INQUEUE隊列中放入過消息Tester類會顯示隊列中無消息
要運行Tester類將Testerclass 和 JNDIUtilclass添加到CLASSPATH然後在命令提示符輸入
Code highlighting produced by Actipro CodeHighlighter (freeware)
> java devx
articles
mqjms
Tester
應用程序向OUTQUEUE寫入一條消息並顯示從INQUEUE檢索到的消息要檢查發送到OUTQUEUE中的消息進入MQ管理器在OUTQUEUE上點擊右鍵?選擇浏覽消息即可
企業中的Java和WMQ MOM
在大型企業環境下可以充分利用WMQ的性能和穩定性優勢只要你的代碼遵循Java標准接口你就可以受益
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19679.html