java bean对象之间复制属性

在现在的企业级Java应用程序中, Java Bean被广泛的应用。 一堆的相关的划分也应运而生, 如DTO, DAO, BO, POJO, VO等。这里不去管这些概念的细节, 如果你感兴趣,可以google之, 比如这篇文章。 这里要讨论的问题是如何在不同的Java Bean对象之间复制它们的属性?
这有几种情况需要考虑:

  • 源对象和目标对象的类型可能不同
  • 只想复制部分的对象
  • 要复制的对象的属性名字不同
  • 如何实现深复制 (deep copy)?

阅读全文

使用MongoDB作为Quartz JobStore

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。你可以到 http://www.quartz-scheduler.org/站点下载 Quartz 的发布版本及其源代码。目前最新的版本是2.2.1。

作为一个优秀的开源调度框架,Quartz 具有以下特点:

  • 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
  • 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
  • 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容

另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成。

下面是Quartz中的一些术语:

  • scheduler: 任务调度器
  • trigger: 触发器,用于定义任务调度时间规则
  • job: 任务,即被调度的任务
  • misfire: 错过的,指本来应该被执行但实际没有被执行的任务调度

阅读全文

Java bean validation 规范与参考实现

JSR 303 – Bean Validation 是一个数据验证的规范。 2009年11月正式发布最终版本。
在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,比如表现层,业务层,持久化层等,很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定,为各个层提供统一的数据校验。

Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。缺省的元数据是 Java Annotations,通过使用 XML 可以对Java注解信息进行覆盖和扩展。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型(JavaBean)的正确性。在JSR303规范中,constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

Hibernate Validator 4.0是 JSR 303 的参考实现。

IBM developerWorks网站有一篇很好的文章介绍它。

JSR 349是Bean Validation 1.1规范,根据社区的反馈对JSR 303进行了优化和加强。 可以点击这里查看细节。
主要围绕一下方面进行工作。

  • 集成其它最新发布的JSR
  • JAX-RS: 对HTTP method进行参数和返回值的校验
  • JAXB: 集成JAXB.
  • JPA: 提升JPA的集成
  • CDI: 允许CDI风格的注入
  • CDI: 集成方法级别的校验
  • EJB: 集成方法级别的校验
  • JSF: 集成JSF

Hibernate Validator 5.x 是Bean Validation 1.1参考实现。

阅读全文

Metrics介绍和Spring的集成

Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。

Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。

Metrics Graphite dashboard

阅读全文

Spring 集成 Kafka

spring-integration-kafka是Spring官方提供的一个Spring集成框架的扩展,用来为使用Spring框架的应用程序提供Kafka框架的集成。
当前spring-integration-kafka仅提供Kafka 0.8的集成,低版本的Kafka并不支持。

新的文章介绍了代码实践: Kafka和Spring集成实践

spring-integration-kafka仅仅支持两个组件,分别对应Producer和 High Level Consumer。 它们分别是:

  • Outbound Channel Adapter
  • Inbound Channel Adapter based on the High level consumer API

其它的Kafka的特性比如Simple Consumer API。 所以使用spring-integration-kafka你并不能指定特定的offset来读取数据,或者进行更灵活的定制。

总的来说,spring-integration-kafka还处于很低级的阶段,和整体的Spring framework/Spring Integration Framework还不是很完美的整合。如果你现在就使用它,可能在开发的过程中会遇到些问题。

阅读全文

Kafka快速入门

编译自官方文档

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),,之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

Apache Kafka与传统消息系统相比,有以下不同:

  • 它被设计为一个分布式系统,易于向外扩展;
  • 它同时为发布和订阅提供高吞吐量;
  • 它支持多订阅者,当失败时能自动平衡消费者;
  • 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。

    First let's review some basic messaging terminology:
    首先来了解一下Kafka所使用的基本术语:


    Topic

    Kafka将消息种子(Feed)分门别类, 每一类的消息称之为话题(Topic).

    Producer

    发布消息的对象称之为话题生产者(Kafka topic producer)

    Consumer

    订阅消息并处理发布的消息的种子的对象称之为话题消费者(consumers)

    Broker

    已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个话题,并从Broker拉数据,从而消费这些已发布的消息。

听起来和JMS消息处理差不多?

让我们站的高一点,从高的角度来看,Kafka集群的业务处理就像这样子:
Kafka集群
Client和Server之间的交流通过一条简单、高性能并且不局限某种开发语言的TCP协议。除了Java Client外,还有非常多的其它编程语言的Client

阅读全文

使用Apache Bench 和 Gnuplot产生性能测试图

Apache Beach (ab)是Apache自带的一个性能测试工具,专门用来测试网站的性能, 不仅限于Apache web服务器。

它可以同时模拟多个并发请求,测试Web服务器的最大承载压力,同时也可以根据Apache Bench提供的测试结果对服务器性能参数进行调整。它可以记录测试数据,其它工具比如Gnuplot可以利用测试数据进行分析。它也可以提供一个summary,可以直观显示当前测试的web服务器的性能。

阅读全文

三步创建Disruptor应用

Disruptor是一个高性能的用于线程间消息处理的开源框架。它的目标就是.
我们知道,java.util.concurrent.ArrayBlockingQueue 是一个非常优秀的有界队列实现。Disruptor与之相比,性能更加的优秀。
性能比较
完整的性能报告在这里.

Disruptor内部使用了RingBuffer,它是Disruptor的核心的数据结构。和其它的RingBuffer实现不同,Disruptor没有尾指针。这样实现是经过深思熟虑的,你可以看这篇文档了解其细节。
更多的参考资料请参照官方文档以及并发编程网上翻译的一些文章

本文主要参考Disruptor入门这篇文章。

本文的代码已全部放在github上。

阅读全文

将网站从GAE迁移到github.io

原先的博客基于Micolog, 部署在GAE上。
由于性能的关系, small operations非常多,经常超出GAE的免费值,网站总处于Down掉的状态。

考察了许多的blog引擎,最后还是决定使用github.io。 使用hexo生成静态页面。
Hexo简单好用,支持skin。目前看来还是不错的。