多线程实例

使用最基础的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());
      }
    };


























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值