自定义监听器监听数据库中数据的变化

此程序只是一个简单的例子,主要监听数据库中Location的数据。

先写一个Event继承EventObject

package com.lbx.listong.servlet;

import java.util.EventObject;

public class LocationEvent extends EventObject {
	
	private static final long serialVersionUID = 1L;
	private Object obj;

	public LocationEvent(Object source) {
		super(source);
		obj = source;
	}

	public Object getSource(){
		return obj;
	}
	
}
 然后写一个接口继承EventListener
package com.lbx.listong.servlet;

import java.util.EventListener;

public interface LocationListener extends EventListener {
	
	public void locationEvent(LocationEvent le);

}
 测试这个监听,实现他的接口
package com.lbx.listong.servlet;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.lbx.listong.service.LocationService;
import com.lbx.listong.thread.ListThread;

public class TestLocationListener implements LocationListener {

	private LocationService ls;

	public TestLocationListener() {
		ls = new LocationService();
		ls.addLocationListener(this);                     //注册监听
		System.out.println("添加监听器完毕");
		try {
			// 调用此方法触发事件,触发的事件就是执行locationEvent(接口的方法)的方法
			ls.addLocation("insert into tb_location (companyId,mobile,longitude,latitude,locationTime) values(2,'444','4','4','2011-03-23 11:03:04')");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	@Override
	public void locationEvent(LocationEvent le) {
		// TODO Auto-generated method stub
		ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
		executor.scheduleWithFixedDelay(new ListThread(), 0, 2, TimeUnit.SECONDS);
	}

}
 LocationService的代码,主要是一些业务的代码,里面只写了增加一个记录触发一个事件
package com.lbx.listong.service;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

import com.lbx.listong.DBUtil.DB;
import com.lbx.listong.servlet.LocationEvent;
import com.lbx.listong.servlet.LocationListener;
import com.lbx.listong.servlet.TestLocationListener;

public class LocationService {
	private Connection conn = null;
	List list = new ArrayList();
	String sql = "select * from tb_location";
	Statement st = null;

	private Vector repository = new Vector();
	private LocationListener ll;
	public LocationService()
	{
	}
	//注册监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
	public void addLocationListener(LocationListener ll)
	{
	    repository.addElement(ll);//这步要注意同步问题
	}
	//如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
	public void notifyLocationEvent(LocationEvent event) {
	    Enumeration e = repository.elements();//这步要注意同步问题
	    while(e.hasMoreElements())
	    {
	      ll = (LocationListener)e.nextElement();
	      ll.locationEvent(event);
	    }
	}
	//删除监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
	public void removeLocationListener(LocationListener ll)
	{
	    repository.remove(ll);//这步要注意同步问题
	}
	
	public List getLocationList(){
		conn = DB.getConnection();
		try {
			st = conn.createStatement();
			ResultSet rs = st.executeQuery(sql);
			while(rs.next()){
				String longitude = rs.getString("longitude");
				list.add(longitude);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return list;
	}
	
	public void addLocation(String sql){
		boolean b = false;
		conn = DB.getConnection();
		try {
			st = conn.createStatement();
			int id = st.executeUpdate(sql);
			if(id>0){
				b = true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//添加一个记录成功就通知事件,然后执行接口的方法
		if(b){
			System.out.println("sss");
			notifyLocationEvent(new LocationEvent(this));
		}
	}
	
	public static void main(String[] args){
		new TestLocationListener();
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值