Tomcat服务器自动加载监听器

来源:互联网 发布:千人基因组数据库使用 编辑:程序博客网 时间:2024/06/05 00:07

为了在Tomcat启动服务时,开始监听某个端口,使用ServletContextListener在服务器启动和关闭时创建和关闭socket服务器。

1. 在web.xml配置监听器:

<listener>        <description>Socket服务随web启动而启动</description>        <listener-class>com.testSocket.SocketListener</listener-class>    </listener>
2. 监听器类

原本是使用注入的方式,从而避免直接获取数据库连接的方式来保存端口取到的数据,实际上,Tomcat不能检测到Spring容器,而是通过反射生成监听器实例,而将监听器类注入到Spring中,Spring容器里面也存在一个监听器实例,Tomcat自己创建的实例根本用不了Spring注入的内容,所以不能采用注入的方式。

public class SocketListener implements ServletContextListener {SocketProcessor process = new SocketProcessor();static Connection conn = null;public void contextDestroyed(ServletContextEvent se) {// 关闭线程try {process.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}public void contextInitialized(ServletContextEvent se) {try {ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(se.getServletContext());DataSource ds = (DataSource) ac.getBean("dataSource");conn = ds.getConnection();process.start();} catch (Exception e) {e.printStackTrace();}}}


3. 数据获取及存储类

class SocketProcessor extends Thread {Socket socket = null;ServerSocket serverSocket = null;PreparedStatement pst = null;public void run() {try {serverSocket = new ServerSocket(15000); // 在15000端口监听while (true) {socket = serverSocket.accept();// 获取输入流,读取客户端发送的信息InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);StringBuilder data = new StringBuilder();Scanner scan = new Scanner(isr);boolean done = false;while (!done && scan.hasNext()) {data.append(scan.nextLine());}String[] strs = data.toString().split("/");LineFB fb = SocketDemo1.getLineFBInstance();StringBuilder sql = new StringBuilder();//获取数据库连接Connection conn = SocketListener.conn;sql.append(" inser into tbl_line ('line_no','line_name','note') values(?,?,?)");pst = conn.prepareStatement(sql.toString());for (String str : strs) {Line line = new Line();String[] s = str.split(";");line.setLineNo(s[0].trim() + new Random().nextInt(1000));line.setLineName(new Random().nextInt(1000) + s[1]);//页面formbean表单数据fb.setLineName(line.getLineName());fb.setLineNo(line.getLineNo());fb.setNote(line.getLineName() + " - " + line.getLineNo());pst.setString(1, fb.getLineNo());pst.setString(2, fb.getLineName());pst.setString(3, fb.getNote());pst.addBatch();}//br.close();isr.close();is.close();pst.executeBatch();conn.commit();}} catch (Exception e) {e.printStackTrace();} finally {}}public void close() {try {System.out.println("s=" + socket);if (socket != null) {socket.close();}if (serverSocket != null) {serverSocket.close();}this.stop();System.out.print("socket已经关闭!!!");} catch (IOException e) {e.printStackTrace();}}}

4.socket客户端测试类

public class TestSocketClient {private static final String HOST_ID = "127.0.0.1";private static final int HOST_PORT = 15000;public static void main(String[] args) {Socket socket = null;try {while (true) {socket = new Socket(HOST_ID, HOST_PORT);// //获取输入流,读取服务器端传送的数据// InputStream is = socket.getInputStream();// InputStreamReader isr = new InputStreamReader(is);// BufferedReader br = new BufferedReader(isr);// String info = null;// while ((info = br.readLine()) != null) {// System.err.println("收到服务器端信息:" + info);// }// socket.shutdownInput();// 获取输出流,向服务器端反映“已接受到消息”OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os);StringBuilder sb = new StringBuilder();int num = new Random().nextInt(20);sb.append("lineNo_" + num + ";" + num + "_号线/");pw.print(sb);pw.flush();// 关闭资源pw.close();os.close();// br.close();// isr.close();// is.close();if (socket != null) {socket.close();}System.err.println(">>>>>>>" + sb.toString());Thread.sleep(2000);}} catch (UnknownHostException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}


 
原创粉丝点击