在JMS1.1規范中規定了5種JMS消息類型,這篇文章給出如何創建和解包每種消息類型的片段代碼。
1.創建一個TextMessage 這個例子裡,股票報價信息被發送成一個TextMessage類型的消息,消息中搭載了一個可以被客戶端讀取的字符串數 據,下面的代碼示范了如何去創建一個這樣的消息:
String stockData; /* 股票信息是一個字符串 */
TextMessage message;
message = session.createTextMessage();
/* 設置股票信息到消息體 */
message.setText(stockData);
2.解包一個TextMessage 去解包一個TextMessage類型的消息,客戶端可以使用Message.getText方法:
String stockInfo;
stockInfo = message.getText();
3.創建一個BytesMessage 股票信息可能是一個服務器端知道如何去構建、客戶端知道如何去解釋的二進制格式的股票報價,象這樣的消息可以 這樣被構造:
byte[] stockData; /* 股票信息是一個字節數組 */
BytesMessage message;
message = session.createBytesMessage();
message.writeBytes(stockData);
4.解包一個BytesMessage 當接收到一個ByteMessage時,可以使用下面的方式來解包:
byte[] stockInfo;
int length;
length = message.readBytes(stockData);
消息體被拷貝到字節數組,客戶端程序可以讀取這個樹組來解釋數據。
5.創建一個MapMessage 每種股票信息可能會包括多種(name/value)成對出現的map,可以使用MapMessage,例如它包括下面的信息: • 股票名 - a String • 當前值 - a double • 時間 - a long • 最後更改 - a double • 股票信息 - a String 去構造這個MapMessage,客戶端可以使用MapMessage的各種set方法(setString, setLong, and so forth)去關聯相關 信息。
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
MapMessage message;
message = session.createMapMessage();
...其他代碼
message.setString("Name", "CN-Java");
message.setDouble("Value", stockValue);
message.setLong("Time", stockTime);
message.setDouble("Diff", stockDiff);
message.setString("Info", "Recent server announcement causes market
interest");
6.解包一個MapMessage 去解包一個MapMessage,客戶端程序可以使用MapMessage的各種get方法來得到MapMessage元素名對應的值,下面給出 了這一個示例:
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
stockName = message.getString("Name");
stockDiff = message.getDouble("Diff");
stockValue = message.getDouble("Value");
stockTime = message.getLong("Time");
如果你想得到整個元素的列表,可以使用MapMessage.getMapNames方法來獲得。
7.創建一個StreamMessage 和MapMessage相似,一個應用程序可以按序列發送多個字段到一個消息中,這些字段都是原始類型的,要做這些,你 可以使用一個StreamMessage,在這裡可以將Java原始類型分配給股票報價信息的每一個條目中: • 股票名 - a String • 當前值 - a double • 時間 - a long • 最後更改 - a double • 股票信息 - a String
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
StreamMessage message;
message = session.createStreamMessage();
下面的元素將被按順序寫到StreamMessage,注意他們沒有象在MapMessage中的命名
message.writeString(stockName);
message.writeDouble(stockValue);
message.writeLong(stockTime);
message.writeDouble(stockDiff);
message.writeString(stockInfo);
8.解包一個StreamMessage StreamMessage中的元素必須按照被寫入的順序讀出:
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
stockName = message.readString();
stockValue = message.readDouble();
stockTime = message.readLong();
stockDiff = message.readDouble();
stockInfo = message.readString();
9.創建一個ObjectMessage 被發送出的股票的信息可能來源於一個指定的StockObject Java對象,這個對象可以在一個ObjectMessage裡作為消息 體被發出。ObjectMessage被用來發送Java對象。 這些值的設置方法由StockObject執行。例如,StockObject可以有一些設置各種數據值的方法,一個使用StockObject 的應用看起來象這樣:
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
StockObject stockObject = new StockObject();
stockObject.setName(stockName);
stockObject.setValue(stockValue);
stockObject.setTime(stockTime);
stockObject.setDiff(stockDiff);
stockObject.setInfo(stockInfo);
ObjectMessage message;
message = session.createObjectMessage();
message.setObject(stockObject);
10.解包ObjectMessage 去解包ObjectMessage,使用ObjectMessage.getObject得到對象,一但對象被取出來,客戶端程序使用Java造型語句將 對象還原成原始對象。
StockObject stockObject;
stockObject = (StockObject)message.getObject();
String stockName; /* 股票名 */
double stockValue; /* 當前值 */
long stockTime; /* 時間 */
double stockDiff; /* 最後更改*/
String stockInfo; /* 股票信息 */
stockName = stockObject.getName();
stockValue = stockObject.getValue();
stockTime = stockObject.getTime();
stockDiff = stockObject.getDiff();
stockInfo = stockObject.getInfo();