?? agentcrbtwshandler.java
字號:
/**
* AgentCrbtWSHandler.java
* @版權: Copyright (C) 2007
* @公司:北京漢銘信通科技有限公司
* @url: www.aceway.com.cn
*/
package com.aceway.vas.xjcrgw.ws.handler;
import java.util.HashMap;
import com.aceway.vas.commons.tcp.TcpClient;
import com.aceway.vas.commons.tcp.Util;
import com.aceway.vas.commons.util.logger.AcewayLogger;
import com.aceway.vas.sjcraw.cbgp201.Msg;
import com.aceway.vas.sjcraw.cbgp201.MsgHead;
import com.aceway.vas.xjcrgw.ws.factory.AgentCrbtWSRespFactory;
/**
* 此類是 CRBT_AGENT 模塊的WEB SERVICES請求處理類,業務操作請求應答消息處理類
* 負責同步并發的WEB SERVICES請求,調用底層NIO通信包發送消息
* 接收服務端的業務操作請求應答消息,響應WEB SERVICES應答
*
* @author zhou tao
*/
public class AgentCrbtWSHandler extends MsgReceiveAdapter implements
AgentWSHandler {
private AcewayLogger acewayLogger = (AcewayLogger) AcewayLogger.getLogger("CrbtAgentLogger");
/**
* 唯一實例
*/
private static AgentCrbtWSHandler agentCrbtWSHandler = new AgentCrbtWSHandler();
/**
* 交易標識,用于唯一標識一次完整的業務。 該域為字符形式表示的十進制數字,由消息發起者設定,應答者對應給回此序列號。 每發起一次業務,該序列號加1。
*/
private static long linkId;
/**
* 字符形式表示的十進制數字,表示一個序列號,由消息發起者設定,應答者對應給回此序列號。 每發起一次請求,該序列號加1。
* 序列號范圍:0000000000-9999999999,循環使用。
*/
private static long seqNo;
/**
* seqNo標識一次webservice請求,map存放這些等待響應的請求 key:seqNo value:obj
*/
private static HashMap waitRespMap = new HashMap();
/**
* 消息是否加密
*/
private boolean isMsgNeedEncrypt;
private AgentCrbtWSHandler() {
}
public static AgentCrbtWSHandler getInstance() {
return agentCrbtWSHandler;
}
public synchronized long genSeqNo() {
return seqNo < 9999999999L ? seqNo++ : 1;
}
public synchronized long genLinkId() {
return linkId++;
}
public int sendMsg(Msg msg) {
return 0;
}
/**
* 發送CBGP消息包,阻塞web services請求
*
* @param msg
* 字節數組形式的CBGP消息
* @param seqNo
* 唯一標識一次web services請求
* @return 發送是否成功
*/
public int sendMsg(byte msg[], String seqNo) {
// 得到TCP客戶端實例
TcpClient tcpClient = Util.getClient();
if (isMsgNeedEncrypt) {// 對消息加密
// TODO:
}
int result = tcpClient.send(msg);
if (result == 0) {// 如果發送成功
RespObj obj = new RespObj();
obj.setSeqNo(seqNo);
synchronized (waitRespMap) {
waitRespMap.put(seqNo, obj);
}
synchronized (obj) {
try {
obj.wait();// 發送完畢,等待請求的響應
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 請求響應消息處理
*
* @param msg
* 字節數組形式的CBGP消息
* @param seqNo
* 唯一標識一次web services請求
* @return 發送是否成功
*/
public void receiveOperRespMsg(byte[] bytes) {
MsgHead msgHead = new MsgHead(bytes);
String seqNo = msgHead.getSeqNo();
RespObj obj = null;
synchronized (waitRespMap) {
// 得到服務端響應結果數據,放入webservices請求線程等待的響應結果對象中
obj = (RespObj) waitRespMap.get(seqNo);
}
if (obj != null) {
obj.setB(bytes);
synchronized (obj) {
obj.notify();// 通知相應webservices請求線程取結果
}
}
}
/**
* 被喚醒的webservices請求線程憑seqno過來取結果 取出結果并刪除
*
* @param seqNo
* 唯一標識一次請求
* @return object Response響應對象
*/
public Object getWSResponse(String seqNo) {
RespObj respObj = null;
Object result = null;
synchronized (waitRespMap) {
respObj = (RespObj) waitRespMap.remove(seqNo);
}
if (respObj != null && respObj.getSeqNo().equals(seqNo)) {
byte[] b = respObj.getB();
result = AgentCrbtWSRespFactory.createAgentCrbtWSResp(b);
}
return result;
}
/**
* 響應對象,每個實例對應一個web wervices請求線程
*/
private class RespObj {
String seqNo;
byte[] b;
public byte[] getB() {
return b;
}
public void setB(byte[] b) {
this.b = b;
}
public String getSeqNo() {
return seqNo;
}
public void setSeqNo(String seqNo) {
this.seqNo = seqNo;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -