使用最基础的main函数来启动容器。
args=new String[]{"D:\\trade_ptdh_3.properties"};
传递进来参数,例如固话的配置文件
其中包含 日志 log4j
多线程数量 threadPool
发出的sql信息 fetchSql
xmlbeans=intfBMO.xml,intfDatabase.xml,ws.xml spring 加载的配置文件
executeBean=trade2Iom spring里面的bean
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.File=/home/iomapp/iom/log/trade_ptdh_3.log
#log4j.appender.A1.encoding=GBK
log4j.appender.A1.MaxFileSize=20MB
log4j.appender.A1.MaxBackupIndex=30
#
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c{1}]-[%p]:%L - %m%n
# Print only messages of level DEBUG or above in the package com.foo.
log4j.logger.org.springframework=INFO
log4j.logger.net.sf.hibernate=INFO
log4j.logger.org.apache=INFO
log4j.logger.bss=DEBUG
threadPool=1
#fetchSql=select * from (select * from ti_b_iom m where m.subscribe_state='0' AND m.brand_code='PTDH' AND substr(trim(m.SERIAL_NUMBER),-1) IN ('5','6') AND m.trade_type_code in ('7101','7303','7110','7301','7210','7220','7302','7304','7305','7311','7317','1397','1399','1400','1401') order by m.priority desc ,m.accept_date) where rownum<=3
fetchSql= SELECT * FROM (SELECT * FROM UOP_CRM1.TI_B_IOM M WHERE TRADE_ID = '9117091222503434')
tradeDataSourceKey=area1
xmlbeans=intfBMO.xml,intfDatabase.xml,ws.xml
executeBean=trade2Iom
启动spring容器
从spring容器中获取bean
ApplicationContext context = new ClassPathXmlApplicationContext(xmlbeans.split(","));
启动多线程
for (int i = 0; i < threadPool; i++) {
System.out.println("###start thread number:"+i);
BaseLsnr baseObj=(BaseLsnr)context.getBean(executeBean);
//设置参数
BaseLsnr.setProps(myProper);
//设置输入参数文件,控制文件锁,锁文件不存在则进程退单
baseObj.setFlock(flock);
//设置当前的线程编号
baseObj.setThreadNbr(i);
//启动
//baseObj.run();
Thread thread=new Thread(baseObj);
thread.start();
调用核心类的定义,是实现了一个Runnable
public class TradeToIomImpl extends BaseLsnr
public abstract class BaseLsnr implements Runnable{
监听类添加了属性,线程锁,线程编号等信息
容器启动创建锁文件
if(flock.exists()){
System.err.println("Lock file "+fconfig.getParent()+":"+fconfig.getName()+"\t does exist already,program exit now.");
System.exit(0);
}else{
try {
if(flock.createNewFile()){
System.out.println("Lock successfully made");
}else{
System.out.println("Create Lock file failed,but this program will continue");
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println(e);
System.exit(0);
}
}
根据配置文件的sql发出sql语句来查询数据,sql语句会限制查询出来的行数。
为什么需要对具体工单进行锁机制
多线程,每次在查询出工单的时候会加锁,之后对工单的状态进行改变。
如果工单没有被加锁,多个线同时处理一个工单会导致一条工单被重复处理。
调用主工单完成核心业务
public void dispatch(TibIom tb)
根据tuxdo返回的报文来处理xml文件
匿名类的形式,动态的为类添加内容来实现。
setter = new BatchPreparedStatementSetter() {
public int getBatchSize() {
return list.size();
}
public void setValues(PreparedStatement ps, int index) throws SQLException
{
TibIom tb = (TibIom)list.get(index);
ps.setString(1, tb.getNewState());
ps.setString(2, tb.getRemark());
ps.setString(3, tb.getProcessTagSet());
ps.setLong(4, tb.getTradeId());
}
};