com.neusoft.mid.clwapi.threadwork.MtMsgSendWorkThread.java Source code

Java tutorial

Introduction

Here is the source code for com.neusoft.mid.clwapi.threadwork.MtMsgSendWorkThread.java

Source

/**
 * @(#)MtMsgWorkThread.java 2013-5-9
 *
 * Copyright 2013 Neusoft Group Ltd. All rights reserved.
 * Neusoft PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.neusoft.mid.clwapi.threadwork;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
import org.apache.cxf.common.util.Base64Utility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.dao.DataAccessException;

import com.neusoft.mid.clwapi.common.ModCommonConstant;
import com.neusoft.mid.clwapi.entity.msg.CoreMsgInfo;
import com.neusoft.mid.clwapi.entity.msg.TerminalViBean;
import com.neusoft.mid.clwapi.mapper.MsgMapper;
import com.neusoft.mid.clwapi.process.delivermsg.SendCommandInfo;
import com.neusoft.mid.clwapi.process.delivermsg.SendDeliverMsgService;
import com.neusoft.mid.clwapi.tools.RandomNumberUtil;
import com.neusoft.mid.clwapi.tools.TimeUtil;

/**
 * @author <a href="mailto:majch@neusoft.com">majch </a>
 * @version $Revision 1.0 $ 2013-5-9 ?11:05:39
 */
public class MtMsgSendWorkThread implements Runnable {
    /**
     * .
     */
    private static Logger logger = LoggerFactory.getLogger(ModCommonConstant.LOGGER_NAME);

    private CoreMsgInfo msgInfo;
    private MsgMapper msgMapper;
    private SendDeliverMsgService sendDeliverMsgService;

    public MtMsgSendWorkThread(CoreMsgInfo msgInfo, MsgMapper msgMapper,
            SendDeliverMsgService sendDeliverMsgService) {
        this.msgInfo = msgInfo;
        this.msgMapper = msgMapper;
        this.sendDeliverMsgService = sendDeliverMsgService;
    }

    public void run() {
        if (null != msgInfo) {

            logger.info("VINS?:" + msgInfo.getVin());
            String[] vinArray = StringUtils.split(StringUtils.strip(msgInfo.getVin()), "|");
            logger.info("???" + vinArray.length + "");
            // ?.
            String batchId = UUID.randomUUID().toString().replaceAll("-", "");
            for (String vin : vinArray) {
                String msgId = createMsgId();
                MDC.put("SUB_ID", "[" + msgId + "]");
                try {
                    logger.info("vin:" + vin + "");
                    TerminalViBean terminalInfo = (TerminalViBean) msgMapper.getRealVehcileByVin(vin);
                    // ????
                    if (isMsgPassable(vin, terminalInfo)) {
                        logger.info("VIN:" + vin + "??????");
                        SendCommandInfo info = initDiaoduCommandInfo(vin, msgInfo.getMsg(), msgInfo.getType(),
                                terminalInfo.getSimCardNum(), batchId, msgId, msgInfo.getUserId());
                        if (null != info) {
                            // ?????
                            sendDeliverMsgService.sendCommandToCoreService(info);

                        } else {
                            logger.info("???,??");
                        }
                    } else {
                        logger.info("VIN:" + vin + "????");
                    }
                } catch (DataAccessException e) {
                    logger.error("??vin:" + vin + "?", e);
                } catch (Exception e) {
                    logger.error("vin:" + vin + "??", e);
                }
                MDC.remove("SUB_ID");
            }
        }

    }

    /**
     * ????.
     * 
     * @param vin
     *            VIN?
     * @param terminalInfo
     *            ??.
     * @return ????.
     */
    private boolean isMsgPassable(String vin, TerminalViBean terminalInfo) {
        boolean flg = true;
        if (null != terminalInfo) {
            logger.info("vin:" + vin + ",TERMINAL_TIME:" + terminalInfo.getTerminalTime() + ",STAT_INFO:"
                    + terminalInfo.getStateInfo() + ",ACC:" + terminalInfo.getAccFlg() + ",SECONDS:"
                    + terminalInfo.getSeconds() + ",SIM_CARD_NUMBER:" + terminalInfo.getSimCardNum());
            if (StringUtils.isEmpty(terminalInfo.getSimCardNum())
                    || StringUtils.isEmpty(terminalInfo.getTerminalTime())) {
                flg = false;
            } else {
                if (!StringUtils.isEmpty(terminalInfo.getStateInfo())) {
                    if (("1".equals(terminalInfo.getAccFlg()) && (terminalInfo.getSeconds() >= 300))
                            || ("0".equals(terminalInfo.getAccFlg()) && (terminalInfo.getSeconds() >= 1800))) {
                        flg = false;
                    }
                } else {
                    logger.info("vin:" + vin + "???,??");
                    // ??
                    flg = terminalInfo.getSeconds() < 300;
                }
            }

        } else {
            logger.info("?vin:" + vin + "?");
            flg = false;
        }
        return flg;
    }

    /**
     * 
     * @param vin
     * @param msg
     * @param type
     * @param simCardNum
     * @param batchId
     * @return
     */
    private SendCommandInfo initDiaoduCommandInfo(String vin, String msg, String type, String simCardNum,
            String batchId, String msgId, String userId) {
        SendCommandInfo sendCommandInfo = new SendCommandInfo();
        sendCommandInfo.setBatchId(batchId);
        sendCommandInfo.setChanleCode(null);
        sendCommandInfo.setMsgId(msgId);
        sendCommandInfo.setOperateUserId(userId);
        sendCommandInfo.setSendCommand("0010");
        sendCommandInfo.setSendType("2002");
        sendCommandInfo.setSimCardNumber(simCardNum);
        sendCommandInfo.setSource("1");
        sendCommandInfo.setTerminalId(vin);

        StringBuffer packet = new StringBuffer();
        packet.append("00042002");
        packet.append("0120");
        packet.append(msgId);
        packet.append("0202");
        packet.append(format(Integer.toHexString(Integer.parseInt(type, 2)), 2));
        packet.append("03");
        try {
            packet.append(format(Integer.toHexString(msg.getBytes("GBK").length), 4));
            packet.append(msg);
        } catch (Exception e) {
            logger.error(msgId + ",?:", e);
            return null;
        }
        try {
            String base64Remark = Base64Utility.encode(msg.getBytes("UTF-8"));
            sendCommandInfo.setRemark(base64Remark);
            logger.info("Base64??REMARK:" + base64Remark);
        } catch (UnsupportedEncodingException e) {
            logger.error("REMARK:" + msg + "?UTF-8Base64?", e);
            return null;
        }
        try {
            logger.info("????PACKET_CONTENT:" + packet);
            String base64Packet = Base64Utility.encode(packet.toString().getBytes("UTF-8"));
            sendCommandInfo.setPacketContent(base64Packet);
            logger.info("Base64??PACKET_CONTENT:" + base64Packet);
        } catch (UnsupportedEncodingException e) {
            logger.error("PACKET_CONTENT:" + packet + "?UTF-8Base64?", e);
            return null;
        }
        sendCommandInfo.setUserId(userId);

        return sendCommandInfo;
    }

    private String format(String str, int len) {
        while (str.length() < len) {
            str = "0" + str;
        }
        return str;
    }

    /**
     * 32??ID.
     * 
     * @return 32??ID.
     */
    private String createMsgId() {
        return "clwapi_" + TimeUtil.getSysTime() + "_" + RandomNumberUtil.randomLong(10);
    }

}