设为首页 加入收藏

TOP

参加工作的第一个月,我开始写下第一篇博客(一)
2019-09-17 18:30:47 】 浏览:36
Tags:参加 工作 第一个月 开始 写下 第一篇 博客

参加工作

关于从学生到职场的转变与心态起伏,已然有许多文笔好的朋友感叹过,我想自己作为一个平凡的人,相较他人也不会有更为特别的感受,自然也就不值当多说。只简单聊聊自身的情况,1月份毕业于非计算机专业,3月底档案上的职业栏从学生变成了软件开发高级工程师手动滑稽,编程功底相比计算机专业的各位前辈有较大差距,但这就是我职业生涯的起点。
进入部门一个月,接触的东西大多都是在学校听过但没有用过的,考虑到脑容量的问题,防止以后持续的东忘西,终于决定将一部分通用的技术或理念或心得记录下来,就从现在开始。

程序整体框架概述

我所接触的是数据采集方面的任务,整个数据采集模块主框架被封装在一个a.jar包之中,程序入口common通过启动命令指定,使用nohuo与&指令将服务运行在后台:

 nohup java -cp 'pwd'/a.jar main.common [args]>>nohup.out &

进入common继续往下看:
首先关注启动命令中所指定的args参数,此参数指定配置文件路径,(程序启动后,a.jar文件所在目录即为根目录,指定路径以此为基础)。通过jar包sysconfig类中定义的静态方法,读取cfg配置文件内容,依次赋值给sysconfig类中的静态变量,作后续使用。
之后利用jar包Server类中的ServerRun静态方法,通过读取上述sysconfig类中的port静态变量,使用mina框架提供的socket通信方法,监听本机端口。

public static void ServerRun(int PORT) throws Exception {

        SocketAcceptor acceptor = new NioSocketAcceptor();
        acceptor.setReuseAddress(true);

        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        chain.addLast("threadPool", new ExecutorFilter(Executors.newFixedThreadPool(sysconfig.socket_poolsize)));

        acceptor.setHandler(new Server());
        acceptor.getSessionConfig().setUseReadOperation(true);
        acceptor.getSessionConfig().setReadBufferSize(30000);
        acceptor.bind(new InetSocketAddress(PORT));
        
        System.out.println("Listening on port " + PORT);
        for (;;) {
            Thread.sleep(1000);
        }
    }

如此一来,通过telnet连接至指定端口,就可以做到与程序进行交互。Server类继承mina框架的IoHandAdapter类,便于管理连接,[mian Iohander事件触发机制可以参考该博文]
(https://blog.csdn.net/boonya/article/details/51583823)
当消息被接收到时,messageReceived事件被触发,这是应用程序需要处理输入信息的地方。这里将首次与外部js文件产生调用,(关于java与js的相互调用,大家可自行查阅相关资料)而后续大量的操作均需要通过外部js代码进行完成,如此重要的操作自然需要一个专门的类进行封装。js类概要功能如下:

import javax.script.*;
public class js {
    public ScriptEngine engine = null;
    public static ScriptEngineManager manager = new ScriptEngineManager();
    public js(String args) throws Exception {
        m_args = args;
        engine = manager.getEngineByName("java script");
        engine.put("engine", engine);
        engine.put("core", this);
        engine.put("args", args);
        ...
        m_files.add(sysconfig.js_run_path + sysconfig.entry_js);
    }
    public Object runfile(String filename) throws Exception {
        java.io.FileReader reader = null;
        try { 
            reader = new java.io.FileReader(filename); 
            return engine.eva l(reader);
        } finally {
            try{ reader.close(); } catch(Exception e){}
        }
    }
    public Object include(String filename) throws Exception{
        return this.runfile(sysconfig.js_run_path + filename);
    }
}

简单地说,就是通过getEngineByName初始化一个ScriptEngine,然后通过put()对变量赋值,通过eva l执行js程序。
了解了js类的主要方法,回过头继续看messageReceived方法中所作的处理。

public class Server extends IoHandlerAdapter {
    @Override
    public void messageReceived(IoSession session, Object message) throws UnsupportedEncodingException {
        String buf = new String(((IoBuffer) message).array(), sysconfig.socket_recv_encode);
        buf = buf.trim();
        if (buf.length() > 0) {
            try {
                    js jengine = new js(buf);
                    jengine.engine.put("client", new Requ(session));
                    jengine.include(sysconfig.entry_js);
                }
                jengine.engine.put("input_0_0_0", buf);
                jengine.engine.eva l("main(input_0_0_0)");
            } catch (Exception ex) {
                ex.printStackTrace();
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                session.closeOnFlush();
            }
        }
    }
}

这里首先生

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇架构初识(一 ) 单体应用架构 下一篇Notes 20180508 : Java基本程序设..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目