标签:增加 gets set 请求过程 except 消费 cep 字段 自己
最开始,先描述一下交易场景:
一般情况下,我们是用 HttpClient 的方式,将商户上送的交易信息组装报文后,通过 post 方式发送到渠道,然后 HttpClient 返回的流信息就是对应的交易结果。这个就是一个同步的交易请求。
现在要解决的问题是,把请求发送到渠道后,渠道不是立即返回信息,而是通过 mq 的方式异步返回结果,而在这个请求过程中,商户还在页面上等待返回交易结果,这就需要交易系统做一个异步转同步的处理,把结果同步的返回给页面等待的商户。
解决思路:
实现过程
public class TransactionInfo {
// 流水号, 在异步结果中关联找到原请求的信息
private String sequenceNumber;
// 原交易对象
private Object originalTrxObj;
// 异步交易结果
private Object trxResultObj;
public TransactionInfo(String sequenceNumber, Object originalTrxObj) {
this.sequenceNumber = sequenceNumber;
this.originalTrxObj = originalTrxObj;
}
public class SyncFactory {
/**
* Key : 交易的请求流水号
* Value :交易的请求信息的封装
*/
private Map<String, TransactionInfo> map = new ConcurrentHashMap<String, TransactionInfo>();
public synchronized TransactionInfo put(String seqNum, Object req){
TransactionInfo info = new TransactionInfo(seqNum, req);
map.put(seqNum, info);
return info;
}
}
// 这里自定义实现获取交易流水号的逻辑
String seqNum = getSeqNum();
// 调用 SyncFactory 的方法,缓存交易信息
TransactionInfo info = syncFactory.put(seqNum, trxReqObj);
// 调用 wait 方法,自定义自己合适的 timeout, 不可能等交易结果等上几小时的嘛
synchronized (info) {
info.wait(syncTimeOut * 1000);
}
public class TransactionResultHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
// 自定义从异步结果中获取交易流水号的逻辑
String seqNum = getNumFromResult();
// 根据上面获取到的流水号,取到缓存的交易信息对象
TransactionInfo info = syncFactory.put(seqNum, trxReqObj);
// 将异步结果的交易结果信息
synchronized (info) {
info .setTrxResultObj(res);
info .notifyAll();
}
}
}
整个异步转同步的过程大概就是这个样子。
然后补充两点这个设计的问题。
// 未返回结果, 判断是否超过自定义的 syncTimeOut, 从 Map 中移除
public boolean expired(int timeout){
return (System.currentTimeMillis()- info.getLiveTime() > syncTimeOut);
}
// 有回结果后, 判断如果在自定义的 syncTimeOut 时间内就返回的话,把 seqNum 对应的交易信息从 Map 中移除
if(System.currentTimeMillis()-info.getLiveTime()< syncTimeOut){
syncFactory.remove(seqNum)
}
大概就是这些。有其他办法的,可以留个链接哇,我也再找其他解决思路~~~
标签:增加 gets set 请求过程 except 消费 cep 字段 自己
原文地址:https://www.cnblogs.com/forwrader/p/13367549.html