package com.webank.bsp_query_agent; import java.net.*; import java.nio.charset.Charset; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.filterchain.*; import org.apache.mina.core.service.*; import org.apache.mina.core.session.*; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.executor.*; import org.apache.mina.filter.logging.*; import org.apache.mina.transport.socket.nio.*; import org.slf4j.*; import com.alibaba.fastjson.JSONObject; public class UdpServerMina extends IoHandlerAdapter { public static final int PORT = 9301; private QueryClient queryClient = new QueryClient(); public Logger logger = LoggerUtils.getAppLogger(); public void exceptionCaught(IoSession session, Throwable cause) throws Exception { logger.error(cause.getMessage()); session.closeNow(); } private String queryClient(String msg) { try { JSONObject query = JSONObject.parseObject(msg); if (query == null) { logger.error("query is null"); return Values.Return.requestError; } String bizSeqNo = query.getString("bizSeqNo"); String consumerSeqNo = query.getString("consumerSeqNo"); String cardNo = query.getString("cardNo"); if (bizSeqNo==null || consumerSeqNo==null || cardNo==null) { logger.error("json format error"); return Values.Return.requestError; } String dcn = queryClient.getDcnByCardNo(cardNo); if (dcn == null) { logger.error("dcn is null"); return Values.Return.dcnNotFound; } String clientInfo = queryClient.queryClientInfo(bizSeqNo, consumerSeqNo, cardNo, dcn); return clientInfo; } catch (Exception e) { logger.error("invalid request"); return Values.Return.requestError; } } public void messageReceived(IoSession session, Object message) throws Exception { if (message instanceof IoBuffer) { IoBuffer buffer = (IoBuffer)message; String msg = new String(buffer.array(), buffer.position(), buffer.limit()); String clientInfo = queryClient(msg); Core.send(session, clientInfo); logger.info("request is {}, response is {}.", msg, clientInfo); } else { Core.send(session, Values.Return.requestError); logger.error("invalid request"); } } public void sessionClosed(IoSession session) throws Exception { } public void sessionCreated(IoSession session) throws Exception { } public void sessionIdle(IoSession session, IdleStatus status) throws Exception { } public void sessionOpened(IoSession session) throws Exception { } public UdpServerMina() { try { NioDatagramAcceptor acceptor = new NioDatagramAcceptor(); acceptor.setHandler(this); DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); if (Props.addLoggingFilter) chain.addLast("logger", new LoggingFilter()); if (Props.is_textline_codec) chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); acceptor.bind(new InetSocketAddress(PORT)); logger.info("server started at port {}", PORT); } catch (Exception e) { logger.error(e.getMessage()); } } public static void main(String[] args) { new UdpServerMina(); } }