参加工作
关于从学生到职场的转变与心态起伏,已然有许多文笔好的朋友感叹过,我想自己作为一个平凡的人,相较他人也不会有更为特别的感受,自然也就不值当多说。只简单聊聊自身的情况,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();
}
}
}
}
这里首先生