2009年1月31日星期六

2009年1月报

雅虎任命卡罗尔巴兹为新CEO

Android创始人离职 称谷歌精力转移至上网本

马云鼓励阿里巴巴员"去消费"

2009年1月26日星期一

新年快乐

happy牛耶你最牛!!

2009年1月22日星期四

Spring线程池(二)

还是之前的业务,使用线程池,线程池里的job的业务是去请求一个http的连接并得到返回。
在qa环境没有问题,在生产服务器上会有30%会报出connection reset的Exception。而且就是在没有量的情况下,就是生产测试随便走10笔。
线程池的配置如下
taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(1);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setQueueCapacity(10000);
taskExecutor.setDaemon(true);
taskExecutor.initialize();

connection reset看下来是因为客户端自己关闭了连接。
难道问题是出在了taskExecutor.setDaemon(true); 这个参数配置上??
这个是因为上次压力把应用压掉我尝试性的加上的。
子线程结束前,父线程就结束,所以是客户端自己关闭连接?!!!
但J2EE容器都是有线程池的,qa环境包括压力环境也没有报出这个问题!服务器的环境配置不一样?!!

在我这个改动上去之前,貌似没有这种情况了?!

加上后走了几笔也没有类似情况发生。

后续。。。。。。

2009年1月21日星期三

Spring事务切面

Spring事务控制是通过AOP的方式实现的,那也就是说必须通过了这个切面才会有事务的代理(从spring的context去取一个bean时)。 

例子1:
事务切面配置在service层
ServiceA中有两个方法a和b
方法a配置为REQUIRED
方法b配置为REQUIRES_NEW
在ServiceA中的a方法调用b方法,这个时候b的REQUIRES_NEW是不起作用的,因为外围调用了ServiceA的a方法,通过了切面,事务配置了REQUIRED。在方法a里面调用b方法,这个时候并没有通过切面,因此方法b的REQUIRES_NEW就不起作用了。
如果在ServiceB中的方法调用ServiceA中的方法b,这个时候通过了前面,因此方法b的REQUIRES_NEW就起作用了。

同理例子2:
使用JTA事务
事务切面配置在service层
ServiceA中有方法a和方法b
ServiceB中有方法c
配置Exception1为rollback-for
如果ServiceA中的方法a调用ServiceB中的方法c,方法c中抛出Exception1,方法a截获并不抛出,但最后事务提交时候还是会rollback。因为调用方法c的时候通过了切面,这个时候JTA事务起了作用,c抛出Excepion1,整个事务就标记为rollback,这个时候不管方法a时候catch住,事务都会rollback。
同样ServiceA中的方法a调用ServiceA中的方法b,方法b中抛出Exception1,方法a截获并不抛出,最后事务是可以提交的。因为调用方法b的时候是在同一个service中并没有通过切面。throws 

因此在一个大型的项目中,一开始就要为之后的开发设置好合理的切面,哪些Exception需要roolback,哪些Exception不需要rollback。

在最近的开发中发现了,Service层的接口还是需要throws特定的Exception的。
情况:
整个公司产品的切面是切在 test.*Service下的所有方法的,并试用JTA事务。一个team开发了一个接口AService中有个方法a,但并没有throws Exception,其他模块要调用这个接口,如果想要在AService的方法a抛出unCheckedException的时候并不打断外围逻辑的执行(外面的事务并不回滚)。因为接口并没有throws 特定Exception,而是会抛出unCheckedException,这个时候就没有办法配置no-rollback-for了。

2009年1月18日星期日

转:Web请求异步处理降低应用依赖风险

http://www.infoq.com/cn/articles/request-asyn-risk-reduce

文章写的很好,本质还是TCP长连接。
互联网的东西最好是一开始就能考虑下压力并发问题。

2009年1月15日星期四

Google记事本停止开发了 5555555

一直都还用呢,随便记记的,总不记得一句话也要用Google文档吧。。。。
大环境下,Google也不得不紧缩一下了。。。

Spring线程池ThreadPoolTaskExecutor

JAVA版本 5.0
J2EE容器 OC4J

controller在处理一个业务后,将消息丢入线程池,然后由task去处理接下来的业务
在30个并发后,一段时间内这个应用会down掉,就像没有部署过一样。

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 最小的同时可执行的任务数
taskExecutor.setCorePoolSize(1);
// 最大的同时可执行的任务数.
taskExecutor.setMaxPoolSize(20);
// 存储任务的队列的容量.
taskExecutor.setQueueCapacity(10000);
taskExecutor.initialize();

最新发现是在队列堆满时会报错,但没有截获,但也不至于把应用给弄down。。。
加了截获,一切就ok了。

需要加一个quartz,防止线程池的丢失和因为压力大线程池队列满而被抛弃的业务消息。

如果条件允许,应该改成jms和mdb的方式更好。

2009年1月3日星期六

OpenSocial的安全问题

http://tech.sina.com.cn/roll/2009-01-03/1849943960.shtml

像facebook、或支持OpenSocial的网站,确实要关注这样的问题。网站的访问量大,客户群多,很容易被开发插件应用程序的人利用。

2009年1月2日星期五

Spring事务战(一)

进过一段时间的呕心沥血,实战了spring的事务配置(主要是Jta事务),虽然结果大家都知道,但是能一点一点的实战出来还是很值得高兴的。
操作系统  winXp
J2EE容器  OC4J / glassFish
数据库    Oracle 10g
spring2.5

开始!!

(一) 一个数据源
在容器中配置一个dataSource,在spring配置中用JNDI引用
然后配置TransactionManage
还可以配置容器自己的TransactionManage如:org.springframework.transaction.jta.OC4JJtaTransactionManager
配置事务控制在
execution(* test.domain..*Service.*(..))

场景:Service -> Sa (test.domain.ServiceA)  中的方法 ma

1 Sa.ma中插入数据 成功;
2 Sa.ma中插入数据,之后抛出uncheckedException,数据回滚;
3 使用不在test.domain..*  Service的service插入数据,之后抛出uncheckedException,数据不回滚
4 实战timeout参数
    
    Sa.ma中插入数据,之后sleep 10秒,数据回滚
5 将timeout参数去除,sleep 10秒,数据不回滚
6 自定义test.exception.TestException,Sa.ma中插入数据,之后抛出TestException,数据不回滚
    spring默认定义,抛出checkedException,数据不rollbank

7 使用参数
    Sa.ma中插入数据,之后抛出TestException,数据回滚

    debug信息:
    
    
    
    
    
    
    

8 使用参数
    Sa.ma中插入数据,之后抛出uncheckedException,数据回滚

9 使用参数
    Sa.ma中插入数据,之后抛出Test2Exception,数据不回滚

    debug信息:
    
    
    
    
    
    
    
    
    

10 使用参数
    Sa.ma中插入数据,之后抛出uncheckedException、TestException、Test2Exception 数据都回滚
11 使用参数
    
    
    Sa.ma方法抛出Test2Exception,数据不回滚
12 将某个方法配制为REQUIRES_NEW
    

14 datasource不用JNDI,在spring配置文件里配置一个datasource
    org.springframework.transaction.jta.JtaTransactionManage
    不能控制事务,需要使用
    
  
      
    JTA事务还是需要依赖于容器,由容器控制datasource


未完,待续。。。

随想——淘友的分享

雅虎口碑上大家可以推荐好的东西,不过框框死了点。
能有一个网站,可以只针对一个大的圈子,比如说淘宝。大家可以来发表淘宝上的好东西(衣服、饰品等所有的东西或店铺),形式可以是迷你博客(饭否),呵呵。
慢慢可以扩大范围。
大家可以关注某一个人的发表,等等。

2009快乐!