Tag: Java

高性能JavaBean属性复制工具BeanUtils的实现

2011-06-25, Posted in Java | 我来说两句 | 查看全文>>

JavaBean属性复制较好的工具有apache提供的Jakarta-Common-BeanUtils,不过他的性能不太近人意,我测试的一个JavaBean共有16个属性,使用Jakarta-Common-BeanUtils与直接使用get/set方法相比,差开800倍!如果是企业内部应用800倍的差别可能影响也没有多大,但如果你做是一个高性能的服务器800倍就是很大的问题.当然,Jakarta-Common-BeanUtils还有一个问题,就是你的项目中必须引入commons-beanutils-x.x.x.jar及等等相关的包,这个我很不喜欢!

不喜欢它,又想要它的功能,那就自己写一个简单的,这样还自主!当然实现这样的JavaBean属性复制工具,必须要满足两个要求才有意义,第一是比它要轻量,甚至一个类就要解决它,第二个性能一定要比它好,这是最关键的.

实现这样的JavaBean属性复制工具,肯定要乃至java的反射. 查看全文…

标签: , ,

Java版本的任务引擎(定时调度器)

2011-05-31, Posted in Java | 4 回复 | 查看全文>>

java的任务引擎(定时调度器)比较多,可以直接使用Timer与TimerTask来写一个,也可以使用Quartz这样的成熟组件.我是一个代码洁癖者,如果在代码中零散的使用Timer与TimerTask我会很难受,同时我也不喜欢引用太多的第三方jar包,因为那样看起来项目会很臃肿,也或会出现无法控制的情况!所以当我需要一个任务引擎(定时调度器),我没有使用成熟的Quartz,而是对Timer与TimerTask做了一个轻量的封装.

在我的想法里,任务引擎至少应该有如下功能:

  • 线程可控
  • 在线程池中可以快速执行一个任务
  • 可以固定延时执行循环执行任务
  • 以固定速率执行循环执行任务
  • 可以方便取消任何任务

基于上面的想法,Java版本的任务引擎可以简单的封装成如下: 查看全文…

标签:

用生产消费者模式实现数据队列定时或定量的异步存储

2011-03-06, Posted in Java, 一起分享 | 1 回复 | 查看全文>>

需求:
最近在考虑IM软件服务器端编程,有这样一个需求,就是把用户发的信息,全部保存到数据库中,如果是一般的web应用,可能就直接把用户提交的数据写入数据库了,但IM的信息的特点时,需要响应快(实时处理),数据量大,根据这个特点,我设计成接收转发模块与数据写入数据库为不同的模块,很明显,他们满足生产消费者模式,即某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。生产者与消费者并没有构成生产消费者模式,而生产者生产的数据由消费者消费的过程才能构成生产消费者模式。

设计:
生产者和消费者模式实现方式很多,但在实现的时候我们至少需要考虑生产消费解耦、支持并发、支持生产消费忙闲不均的情况。
一、解耦
  假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。这个缓冲区我们可以用一个列队实现。
  
二、支持并发(concurrency)
  生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。
  使用了生产者/消费者模式之后,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据往缓冲区一丢,就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式,主要就是用来处理并发问题的。这样高并发下,用户感觉响应很快:)
  
三、支持忙闲不均
  缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

除了以上三个需要考虑的,在我的项目中,我还要考虑与数据库的交互不能太频繁,只能满足一定数据量时,使用批量方式写入数据库(定量写入),这个实现本身很简单,但如果考虑到服务器清闲时,很长时间都达不到这个数据量,但这段时间内可能会停机,没有写入数据库的数据就可能丢失,所以在给定的一段时间里,数据量没有到达给定数据的条件,只要达到时间条件,也需要写入数据库。

实现:
基于以上的想法,我们可以使用java.util.concurrent.BlockingQueue来实现,这里仅分析一些关键代码 查看全文…

标签: ,

用java程序向wordpress发布文章

2010-05-13, Posted in 人生百味 | 14 回复 | 查看全文>>

java向wordpress发布文章也成?当然成!不仅能发布文章,读写都不成问题,还很方便,这些便利得益于XML-RPC协议。WordPress提供了XML-RPC API使得第三方的可以与之通信来发布和修改博客。我们也可以使用这个接口做一些工作,例如:在网站首页显示最新的博客、在博客之外的页面上发表博客文章、把博客与其他内容管理系统结合等。 查看全文…

标签: , , ,

通用文章采集器的设计与实现

2010-05-12, Posted in 人生百味 | 9 回复 | 查看全文>>

最近头脑有点发热,想做一个采集器来采集文章,然后做一个类似垃圾站的东西,当然,使用的文章发布程序还是用wordpress,wordpress上的采集器不太多,他们大多都是通过rss采集,这也不太合适我,因为如果做为文章采集,采集的对象可能有文章内分页,所以最终还是自己写一个程序吧,自己最熟悉的还是java,那就用java写吧。

采集一堆文章,主要有如下步骤:
第一:采集规则定义
第二:按指定的规则进行文章采集

根据以上步骤,我们分开来实现。采集规则的定义实际就是你要做什么,怎么做的定义,我们这里很明确,就是指定一个列表的url地址,提取列表中所有文章的url,然后再一一采集各文章中的标题、内容,如果每篇文章有内分页,还要分别提取。所以,我们首先要做的,就是给定一个url地址,取得对应的html源码。下面是一个实现,它模拟浏览器,向url发出http请求,服务器返回 查看全文…

标签: ,