http转发实现之一:转发代码的实现(一)

2014-11-24 08:12:22 · 作者: · 浏览: 1

最近公司实现一个银行网关系统,主要目的是接收银行的结果通知,并转发到后台的支付处理集群,在同时对银行的结果通知进行存储。如果银行网关系统通知处理集群失败。则在未来一段时间内对这些数据实施重发补偿。简而言之,这样做的好处是减少掉单率,在集群遇到重大问题宕机时,也能在很大程度上挽回损失,因为存储了银行通知,有补偿机制。我负责系统的主要编码工作。废话从简,把这个系统的核心代码贴上再说。
1 接收转发类

[java]
package com.vness.httpforward.handler;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.vness.common.logger.writeLog;
import com.vness.httpforward.connector.VnHttpConnector;

/*
* author:v.tone
* time:2012.05
*/

public class VnHttpForwardHanlder {
private HttpServletRequest request; // 原有请求串
private HttpServletResponse response;
private String targetAddr; // 转发目标地址
private Map returnData;

private int _maxDataSize = 1024;

private int timelimit = 10;

public HttpServletRequest getRequest() {
return request;
}

public void setRequest(HttpServletRequest request) {
this.request = request;
}

public HttpServletResponse getResponse() {
return response;
}

public void setResponse(HttpServletResponse response) {
this.response = response;
}

public String getTargetAddr() {
return targetAddr;
}

public void setTargetAddr(String targetAddr) {
this.targetAddr = targetAddr;
}

public Map< , > getReturnData() {
return returnData;
}


@SuppressWarnings("unchecked")
public void setReturnData(Map< , > returnData) {
this.returnData = ((Map) returnData);
}

public int getTimelimit() {
return timelimit;
}

public void setTimelimit(int timelimit) {
this.timelimit = timelimit;
}

public VnHttpForwardHanlder(HttpServletResponse rsp,
HttpServletRequest req, String addr) {
this.request = req;
this.targetAddr = addr;
this.response = rsp;
}

public VnHttpForwardHanlder() {
}

// 转发前检查
protected boolean preCheck() {
if (this.targetAddr == null || this.targetAddr.equals("")) {
writeLog.write("dispatch_", "dispatcher address is null.");
returnData.put("ERR_CD", "0001");
return false;
}
// 请求串为空
if (this.request == null || this.request.equals("")) {
writeLog.write("dispatch_", "Entry request string:" + this.request);
returnData.put("ERR_CD", "0002");
return false;
}
return true;
}

protected byte[] receiveData() throws Exception {
byte[] data = new byte[0];
if (request.getMethod() == "GET") {
String queryStr = request.getQueryString();
if (null != queryStr) {
data = queryStr.getBytes();
}
} else {
int msgLen = request.getContentLength();
if (msgLen <= 0) {
msgLen = request.getInputStream().available();
}

// dataSize check
if (-1 != _maxDataSize) {
if (msgLen > _maxDataSize) {
returnData.put("ERR_CD", "0003");
throw new Exception("post data