最近接手一个古老的javaweb项目,项目中使用了axis的方式调用webservice,实现数据推送,但是由于客户提供的资料只有wsdl文件,所以就采用了相对熟悉的cxf方式创建webservice客户端。因为已有axis的jar包,所以中间也是摸索了好几个小时。本文主要介绍cxf在axis的基础上创建webservice客户端,同时总结oracle触发器。
一、触发器
1.触发器介绍
create [or replace] trigger trigger_name {before | after} trigger_event on table_name [for each row] [when trigger_condition] trigger_body
trigger_name:触发器名称
before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
trigger_event:触发事件,在DML触发器中主要为insert、update、delete等
table_name:表名,表示发生触发器作用的对象,也可以指定为视图名称
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体
2.触发器应用场景
2.1 数据同步
我有两个系统,其中系统A负责插入数据,但是系统B也想获得这些新增的数据,并且做到数据同步性,这该怎么做呢,此时,我们就可以使用触发器,当A往表中插入数据时,把数据同步到B库中去,B中可以使用标志字段确保这个数据是否已读,或者做一张临时表,永远存储A库触发过来的新增数据。B系统定时任务去取这张临时表。
场景一、当我们往employee插入一条数据的时候,就往employee_bak同步插入一条数据
create or replace trigger trigger_policy ---触发器名称 before insert on employee ---在新增之前进行操作,也有after属性 for each row ---每改动一行就同步下数据 begin --------------具体同步过程,:new.id新增的那条数据,获取数据中的id insert into employee_bak (id,name,birthday,address) values(:new.id,:new.name,:new.birthday,:new.address); end;
oracle中的快照备份是异步的。 而利用触发器,是同步的。
场景二、当我们删除employee表的数据后,自动向操作日志表log表插入一条数据
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; CREATE OR REPLACE TRIGGER employee_log BEFORE DELETE --指定触发时机为删除操作前触发 ON employee FOR EACH ROW --说明创建的是行级触发器 BEGIN --将修改前数据插入到日志记录表 del_emp ,以供监督使用。 INSERT INTO operationlog (deptno , empno, ename , job ,mgr , sal , comm , hiredate ) VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate ); END;
2.2 限制对表的操作
限制对user表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改user表。
CREATE OR REPLACE TRIGGER tr_user BEFORE INSERT OR DELETE OR UPDATE ON user BEGIN IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改user表'); END IF; END;
只能对部门id为10的人员进行操作
CREATE OR REPLACE TRIGGER tr_user BEFORE UPDATE OF salary, commission_pct OR DELETE ON user FOR EACH ROW WHEN (old.department_id = 10) BEGIN CASE WHEN UPDATING ('salary') THEN IF :NEW.salary < :old.salary THEN RAISE_APPLICATION_ERROR(-503, '部门10的人员的工资不能降'); END IF; WHEN UPDATING ('jiangjin') THEN IF :NEW.jiangjin < :old.jiangjin THEN RAISE_APPLICATION_ERROR(-500, '部门10的人员的奖金不能降'); END IF; WHEN DELETING THEN RAISE_APPLICATION_ERROR(-502, '不能删除部门10的信息'); END CASE; END;
2.3 数据审计
如果user表的age大于某个数值就往告警表插入一条数据
CREATE OR REPLACE TRIGGER tr_user after UPDATE ON user FOR each ROW DECLARE-- local variables here BEGIN IF : new.age > 20 THEN INSERT INTO warnlog VALUES ( : new.sal || '-' || : new.username || '-' || : new.job ); END IF; END tr_user;
二、webservice
axis和cxf方式最主要会有一个XmlSchema的jar包冲突,解决这个冲突的办法也很简单就是使用xmlshema-core.jar替换这个jar包。但是要注意版本,我是升级了个版本才有效的。
中间经历了很多的报错
Exception in thread "main" java.lang.NoSuchFieldError: QUALIFIED
java.lang.IllegalStateException: Unable to create endpoint: null
最终整合下来的jar包如下
import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub final String address = "http://127.0.0.1:8001/netgate-server/webservice/api?wsdl"; JaxWsDynamicClientFactory dcflient=JaxWsDynamicClientFactory.newInstance(); Client client=dcflient.createClient(address); HTTPConduit http = (HTTPConduit) client.getConduit(); http.getClient().setReceiveTimeout(0); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(180*1000);// 连接超时(毫秒) httpClientPolicy.setAllowChunking(false);// 取消块编码 httpClientPolicy.setReceiveTimeout(300*1000);// 响应超时(毫秒) http.setClient(httpClientPolicy); try { Object[] objectall=client.invoke("Bind","Root","Admin","123","aaaaaaaaaaaa","",""); System.out.println("*******"+objectall[0].toString()); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
源代码资源https://download.csdn.net/download/qq_35921773/12689366