fix协议封装挑战-BusinessMessageRejectMessageHandler

网友投稿 304 2022-12-02

fix协议封装挑战-BusinessMessageRejectMessageHandler

package cs.mina.client.handler;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import org.apache.log4j.Logger;import org.apache.mina.core.session.IoSession;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.DefaultTransactionDefinition;import cs.base.IBaseService;import cs.entity.Admin;import cs.entity.Announce;import cs.entity.FreezeRecord;import cs.entity.FundLog;import cs.entity.Member;import cs.entity.Order;import cs.entity.Product;import cs.entity.StockHold;import cs.mina.ExecIDSet;import cs.mina.MessageMap;import cs.mina.SeqNumAndDatabaseIdMap;import cs.mina.codec.msg.BaseMsg;import cs.mina.codec.msg.BusinessMessageRejectMsg;import cs.mina.codec.msg.ExecutionReportMsg;import cs.mina.codec.msg.MsgType;import cs.mina.codec.msg.NewOrderSingleMsg;import cs.mina.codec.msg.OrderCancelReplaceRequestMsg;import cs.service.IAdminService;import cs.service.IAnnounceService;import cs.service.IFreezeRecordService;import cs.service.IFundLogService;import cs.service.IMemberService;import cs.service.IOrderService;import cs.service.IProductService;import cs.service.IStockHoldService;import cs.util.ApplicationContextUtil;import cs.util.Constant;import csulog.CSULog;/* *@author(huangxiaoping) *@date 2013-12-2 */public class BusinessMessageRejectMessageHandler implements ClientMessageHandler { private static final Logger logger=Logger.getLogger(BusinessMessageRejectMessageHandler.class); private static final CSULog csuLog=CSULog.getInstance(); @Override public void doHandler(IoSession session, BaseMsg message) { DataSourceTransactionManager txManager=(DataSourceTransactionManager)ApplicationContextUtil.getApplicationContext().getBean("transactionManager"); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { BusinessMessageRejectMsg msg=(BusinessMessageRejectMsg)message; csuLog.log_INFO("收到业务消息被拒消息[msgType=j],[refMsgType="+msg.getRefMsgType().getTagValue()+"],[refSeqNum="+msg.getRefSeqNum().getTagValue()+"],[reason="+msg.getBusinessRejectReason().getTagValue()+"]"); //获取service IAnnounceService announceServiceImpl=(IAnnounceService)ApplicationContextUtil.getApplicationContext().getBean("announceServiceImpl"); IOrderService orderServiceImpl=(IOrderService)ApplicationContextUtil.getApplicationContext().getBean("orderServiceImpl"); IAdminService adminServiceImpl=(IAdminService)ApplicationContextUtil.getApplicationContext().getBean("adminServiceImpl"); IMemberService memberServiceImpl=(IMemberService)ApplicationContextUtil.getApplicationContext().getBean("memberServiceImpl"); IFundLogService fundLogServiceImpl=(IFundLogService)ApplicationContextUtil.getApplicationContext().getBean("fundLogServiceImpl"); IProductService productServiceImpl=(IProductService)ApplicationContextUtil.getApplicationContext().getBean("productServiceImpl"); IStockHoldService stockHoldServiceImpl=(IStockHoldService)ApplicationContextUtil.getApplicationContext().getBean("stockHoldServiceImpl"); IFreezeRecordService freezeRecordServiceImpl=(IFreezeRecordService)ApplicationContextUtil.getApplicationContext().getBean("freezeRecordServiceImpl"); String dbid=SeqNumAndDatabaseIdMap.get(msg.getRefSeqNum().getTagValue()); Order order=new Order(); order.setId(Integer.parseInt(dbid)); //BaseMsg baseMsg=MessageMap.getMessageBySeqNum(msg.getRefSeqNum().getTagValue()); order=((IBaseService)orderServiceImpl).get(order); Member member=order.getMember(); Product product =productServiceImpl.findByCode(order.getProduct().getCode()); StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(product.getId(), member.getId()); if(msg.getRefMsgType().getTagValue().equals(MsgType.NEW_ORDER_SINGLE)){ //NewOrderSingleMsg orderMsg=(NewOrderSingleMsg)baseMsg; //String side=orderMsg.getSide().getTagValue(); String transType=order.getTransType(); String side=""; if(transType.equals(Order.TRANSTYPE_BUY)){ side="1"; }else if(transType.equals(Order.TRANSTYPE_SELL)){ side="2"; }else{ csuLog.log_ERROR("BusinessMessageRejectMessageHandler逻辑transType错误[tt="+transType+"]"); } order.setState(Constant.ORDER_STATUS_REJECT); if(side.equals(Constant.FIX_SIDE_BUY+"")){ csuLog.log_INFO("修改前的用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]"); member.setBalance(member.getBalance()+order.getPrice()*order.getWaitTrans()); FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), member.getId()); member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt()); ((IBaseService)memberServiceImpl).modify(member);//修改用户冻结资金 csuLog.log_INFO("修改后用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]"); ((IBaseService)freezeRecordServiceImpl).delete(freezeRecord);//删除冻结资金 csuLog.log_INFO("删除冻结资金记录[lgid="+freezeRecord.getUser().getLgid()+"],[orderId="+order.getId()+"],[id="+freezeRecord.getId()+"],[orderId="+freezeRecord.getOrder().getId()+"],[amt="+freezeRecord.getAmt()+"]"); //记录资金明细 FundLog fundLog=new FundLog(); fundLog.setAmount(order.getPrice()*order.getWaitTrans()); fundLog.setBalance(member.getBalance()); fundLog.setIp("127.0.0.1"); fundLog.setLaType(FundLog.LATYPE_TD_TAD); fundLog.setLog("订单新增业务层被拒[id="+order.getId()+"]退回资金"); fundLog.setLpType(FundLog.LATYPE_TD_TDD); fundLog.setMember(member); fundLog.setTime(new Date()); ((IBaseService)fundLogServiceImpl).add(fundLog); csuLog.log_INFO("新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]"); }else if(side.equals(Constant.FIX_SIDE_SELL+"")){ stockHold.setAmt(stockHold.getAmt()+order.getQuantity()); ((IBaseService)stockHoldServiceImpl).modify(stockHold); csuLog.log_INFO("修改持股变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+order.getQuantity()+"],[total="+stockHold.getAmt()+"]"); }else{ csuLog.log_ERROR("BusinessMessageRejectMessageHandler逻辑side错误[side="+side+"]"); } }else if(msg.getRefMsgType().getTagValue().equals(MsgType.ORDER_CANCEL_REQUEST)){ order.setState(order.getLastState()); }else if(msg.getRefMsgType().getTagValue().equals(MsgType.ORDER_CANCEL_REPLACE_REQUEST)){ //OrderCancelReplaceRequestMsg crMsg=(OrderCancelReplaceRequestMsg)baseMsg; order.setState(order.getLastState()); order.setPrice(order.getLastPrice()); order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans()); order.setWaitTrans(order.getLastAmt()); //String side=crMsg.getSide().getTagValue(); String transType=order.getTransType(); String side=""; if(transType.equals(Order.TRANSTYPE_BUY)){ side="1"; }else if(transType.equals(Order.TRANSTYPE_SELL)){ side="2"; }else{ csuLog.log_ERROR("BusinessMessageRejectMessageHandler逻辑transType错误[tt="+transType+"]"); } if(side.equals(Constant.FIX_SIDE_BUY+"")){ csuLog.log_INFO("修改前的用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]"); double money=order.getPrice()*order.getWaitTrans()-order.getLastAmt()*order.getLastPrice(); member.setBalance(member.getBalance()+money); FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), member.getId()); member.setAmtFrozen(member.getAmtFrozen()-money); ((IBaseService)memberServiceImpl).modify(member);//修改用户冻结资金 csuLog.log_INFO("修改后用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]"); freezeRecord.setAmt(freezeRecord.getAmt()-money); ((IBaseService)freezeRecordServiceImpl).modify(freezeRecord); csuLog.log_INFO("修改资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(-money)+"],[leaveTotal="+freezeRecord.getAmt()+"]"); //记录资金明细 FundLog fundLog=new FundLog(); fundLog.setAmount(money); fundLog.setBalance(member.getBalance()); fundLog.setIp("127.0.0.1"); fundLog.setLaType(FundLog.LATYPE_TD_TAD); fundLog.setLog("订单修改业务层被拒[id="+order.getId()+"]回退到前一个状态"); fundLog.setLpType(FundLog.LATYPE_TD_TDD); fundLog.setMember(member); fundLog.setTime(new Date()); ((IBaseService)fundLogServiceImpl).add(fundLog); csuLog.log_INFO("新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]"); }else if(side.equals(Constant.FIX_SIDE_SELL+"")){ stockHold.setAmt(stockHold.getAmt()+(order.getWaitTrans()-order.getLastAmt())); ((IBaseService)stockHoldServiceImpl).modify(stockHold); csuLog.log_INFO("修改持股变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+(order.getWaitTrans()-order.getLastAmt())+"],[total="+stockHold.getAmt()+"]"); }else{ csuLog.log_ERROR("BusinessMessageRejectMessageHandler逻辑side错误[side="+side+"]"); } }else{ csuLog.log_ERROR("不支持的消息原类型"); } ((IBaseService)orderServiceImpl).modify(order); Announce announce=new Announce(); announce.setBeginTime(new Date()); announce.setUpdateTime(new Date()); Admin admin=new Admin(); admin.setLgid("admin"); admin=adminServiceImpl.getAdminByLgid(admin); announce.setPromulgator(admin); announce.setMember(order.getMember()); announce.setAlert(Announce.ALERT_VIEW); announce.setTitle("订单被拒"); switch(Integer.parseInt(msg.getBusinessRejectReason().getTagValue())){ case 0: announce.setContent("原因:其他(Other)"); break; case 1: announce.setContent("原因:未知id(Unknown ID)"); break; case 2: announce.setContent("原因:未知证券(Unknown Security)"); break; case 3: announce.setContent("原因:不支持的消息类型(Unsupported Message Type)"); break; case 4: announce.setContent("原因:应用程序不可用(Application not available)"); break; case 5: announce.setContent("原因:条件必须字段丢失(Conditionally required field missing)"); break; case 6: announce.setContent("原因:没有授权(Not Authorized)"); break; case 7: announce.setContent("原因:分发到公司当前时间不可用(DeliverTo firm not available at this time)"); break; case 18: announce.setContent("原因:无效的价格增长(Invalid price increment)"); break; default: announce.setContent("原因:其他(Other)"); break; } Calendar ca=new GregorianCalendar(); ca.setTime(new Date()); ca.add(GregorianCalendar.MONTH, 1); announce.setEndTime(ca.getTime());//结束时间为发布起一个月 announce.setDestType(Announce.DEST_TYPE_MEMBER); announceServiceImpl.addAnnounce(announce); csuLog.log_INFO("发送用户通知[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[title="+announce.getTitle()+"],[content="+announce.getContent()+"]"); txManager.commit(status); } catch (Exception e) { txManager.rollback(status); DbFail fail=new DbFail(); fail.setMsg(message); DbFailModule.getInstance().addFail(fail); csuLog.log_ERROR("执行报告发生异常,回滚事务,将执行报告放入错误重新执行线程"); logger.error("执行数据库错误", e); } }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动生成仓储结构、实体结构 T4模板
下一篇:Java和Scala集合间的相互转换方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~