获益于异步日志服务
使用Hibernate和JMS开发异步日志服务
摘要
在软件开发中,日志是一个相当重要的组件,特别是对于软件的健壮性而言。通常,日志服务是同步的,会带来额外的性能开销(特别是在紧急的情况下)。这样的日志服务不能有效地作为分布式日志服务。在一个分布的计算环境中,比如J2EE,客户端期望日志能够被并发的记录到中央数据库,J2EE架构不提倡将日志记录到文件或者打印到控制台。做为JMS的一个应用,你可以使用异步的日志服务来代替通常的同步日志服务. 这样客户端便能在不阻塞的情况下继续执行. 在可靠模式(guaranteed mode)下,日志数据被提交(且仅仅被提交一次)到目的地(destination),接下来,日志信息将被Hibernate轻松的持久。这篇文章就是介绍如何使用Hibernate和JMS来开发一个异步的日志服务。
正文
开发一个通用的日志服务通常会引发争论。现在,已经有相当多的日志框架可用,这些日志服务是由专职人员或者开源社区开发的,特别应该提到Log4j和J2SE1.4的日志。由于许多日志框架都是在JMS(Java消息服务-Java Message Service)还没有问世前开发的,并没有使用异步日志。在JMS问世后,框架被设计,以便能使用异步日志。
在传统的同步日志模型里,在日志服务调用没有成功返回前,调用者是不能往下执行的,所有的调用者都被阻塞,直到记录被持久或被日志服务所接收。显然,那样会导致额外的开销,特别是当一个应用被设计来记录大量的日志信息。想像一个日志文件有大量的(通常是数百)日志语句组成,每一条日志信息都应该在下一个日志被处理前记录完成,这是一个相当耗时处理过程。在分布计算环境中,客户端是并发运行的,可选择的方法是使用传统的日志服务创建并发的客户端,虽然性能是个问题。分布式计算框架会部署到很多服务器上(物理上相似的或者不相似的许多地方),在这种情况下,记录日志到中心数据库是相当烦琐的,而且也几乎不可能
本文将引导你开发一个简单的日志服务。创建一些日志信息,通过网络发送到JMS提供者,并且持久到数据库。为这个目的,我们使用JMS来实现异步、使用Hibernate来持久数据。你可以以多种方式持久数据,比如标准的JDBC(Java Database Connectivity)连接、EJB(Enterprise JavaBean),或者存储过程。我推荐使用工具从传统的POJO(plain-old Java objects)创建实体域。在这篇文章里,我使用Hibernate,来替代原先使用EJB构建的实体模型
在开发日志服务前,让我们来了解下一些重要概念,这些概念关系到这次的应用开发。
企业级消息(Enterprise JavaBean)
J2EE关于分布计算环境还在继续完善,我们能够补充它的许多特性,比如JMS,以开发异步服务。JMS是SUN微系统的一个规范,并且适用于在标准的应用程序间通讯。参考资源部分,下载这个规范,Third-party vendors 实现了Sun定义的这个规范。JMS被设计用来处理不同的消息类型(消息无需知道自己持有的信息)
远程过程调用(RPC)模型,比如RMI(远程方法调用-remote method invocation)、SOAP(简单对象访问协议-Simple Object Access Protocol)、ORB(对象请求代理-object request broker)等是中央接口的,意味着发布者期望一个返回值。在使用JMS环境中,发送者并不了解接收者。接收和发送消息的应用依赖于特定的通道,但是他们并不通讯,实际上,他们只是被委托去传输消息给JMS提供者,应用程序发送消息到目的地后,他们的工作也就完成了。
消息类别
JMS 提供两种消模型,点对点(porint-to-porint)和发布/订阅(publish/subscribe)。点对点是基于队列的消息模型,每一个客户端都发送消息到一个目的队列,这些消息存在一个栈里。消息也可以被持久化,以保证服务器当机时,数据仍然可用。JMS提供者投递到达堆栈的消息,以供给消费者。在点对点模型里,一个消息只能被投递给一个消费者。
在发布/订阅是广播模型,在该模型中,所有对某一特定主题感兴趣的客户端,把自己注册为一个监听。发布者发布它的消息到目的地(主题),JMS提供者负责分发消息给这些监听。在这个模式中,所有的监听都会消费每一个消息
消息驱动Bean
EJB2.0介绍了一种新的Bean组件类型:消息驱动Bean(MDB)。该Bean不响应客户端的调用。事实上,没有提供任何接口使得客户端可以调用MDB。当收到特定的JMS消息时,只有容器才激活MDB。MDB仅仅是消息消费者,MDB的执行是简洁的,所有的JMS管理信息都在部署中被描述,在onMessage函数里,接收和处理消息的行为按照部署执行。查看资源部分,获取更多MDBs信息
Hibernate
Hibernate是用于免除JDBC编码的开源产品。这是一个在java环境实现OR映射的工具,它在Java 对象和数据库实体间建立映射。在企业开发中,对象关系映射是一个关键需求,产生的或者修改的数据必须被持久。数据持久是开发人员的一个恶梦,尤其是需求的多边,而导致数据模型的修改。Hiberante可以减轻数据持久的复杂化。查看资源部分以了解Hibernate的更多信息,本文介绍开发的日志服务,将使用Hibernate作为OR持久的媒介。
异步日志服务
在上面的几节,我简单的介绍了开发这个日志服务所需的主要技术。现在让我们使用JMS和Hibernate来开发一个简单的框架。
概要的讲一下,异步日志服务是如下工作:客户端创建一个日志消息LogMessage(Value Object),要求辅助类(JMSLogger)发布这个消息到队列。辅助类(JMSLoger)使用日志消息来创建一个JMS的Object Message,然后提交到队列。一旦消息到达,容器就调用监听这个队列的MDB,访问它的onMessage回调方法。MDB读取消息(LogMessage),然后使用Hibernate持久消息到数据库
日志服务使用JMS的点对点消息方式。一旦一个日志消息被送出,客户端不需要担心日志消息被送到了哪里,或者它是否被发送。客户端信任JMS的消息机制,保证消息被投递。
下面的图例说明了日志服务的主要组成
功能框架:日志服务的主要组件
框架组件
在分析实现细节前,让我们来仔细看一下这些组件,日志程序是这个应用的入口点,作为非J2EE的客户端使用,这与J2EE客户端只有较小的差异。日志程序使用JMSLogger发送消息到队列,它创建一个日志消息(LogMessage),然后由JMSLogger发送到LogMessageQueue目的地
JMSLogger是一个JMS类,一旦被实例化,它就关联自己到消息目的地。因此,当JMSLogger被日志程序创建,它就通过JNIDI(Java命名目录访问接口-Java Naming and Directory Interface)命名空间查找连接工厂(Connection Factory)和队列(Queue),然后开启和JMS提供者(JMS Provider)的会话(Session),接下来,JMSLogger就发送消息到目的地。应用客户端通过简单的实例化日志程序和调用它的方法来访问日志服务。在J2EE环境下,日志服务只在应用服务启动的时候被实例化一次,当应用服务启动时,使用Java管理扩展(JMX-Java Management Extensions)来管理Beans,这样客户端便能通过JNDI查找到这个服务,然后象往常一样,调用它的方法来持久日志消息
LogMessageQueue是日志消息发送的目的地,一个MDB监听这个队列。一旦消息到达队列,EJB容器就调用MDB,并且委派它作更多的处理。MDB取出日志消息(LogMessage),通过Hiberante的持久机制,持久日志消息到数据库。
LogMessage是一个被持久的含有日志信息的Java对象。它被设计成用来持有日志信息,比如简洁描述、详细描述、日志时间和日志级别。
实现
现在,我将详细描述日志服务的实现,在资源部分,你能下载所有的实现代码,然后解压到本地目录。
创建日志表格</
分享到:
相关推荐
ActiveMQ则是Apache出品的一个开源消息中间件,它实现了JMS(Java消息服务)规范,提供异步通信能力。在分布式系统中,ActiveMQ扮演着消息队列的角色,允许不同组件之间通过发送和接收消息进行通信。这样做的好处是...
7. **异步日志**:在高并发环境下,JBoss Logging还支持异步日志记录,以防止日志输出成为系统瓶颈。 8. **可扩展性**:JBoss Logging的API设计使得其易于扩展,可以很容易地添加新的日志处理器或适配器。 了解并...
7. **JMS与消息队列**:Java消息服务JMS允许应用异步发送和接收消息,提高了系统的可扩展性和可靠性。常见的消息队列产品如ActiveMQ和RabbitMQ可以集成到Java EE应用中。 8. **容器与部署**:Tomcat、Jetty等...
7. **Web服务与RESTful API**: 学习如何使用Java的JAX-WS和JAX-RS标准来创建和消费Web服务,包括SOAP和RESTful API,这对于构建分布式系统至关重要。 8. **Spring框架**: 作为Java EE的补充,Spring框架提供了依赖...
4. **JMS**:Java消息服务允许应用程序创建、发送、接收和读取消息,支持点对点和发布/订阅两种模型。 5. **JTA**:Java Transaction API提供了分布式事务处理能力,确保跨多个系统的交易一致性。 6. **JPA**与...
这些技术通常结合使用,例如,Spring可以作为基础框架,Struts2处理前端请求,Hibernate管理数据持久化,而J2EE提供了运行环境和一些基础服务。这种组合使得开发者能够快速构建复杂、健壮的Web应用程序,同时保持...
它提供了包括EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)和JSF(JavaServer Faces)在内的多种服务。 2. **安装与配置** 安装JBoss涉及下载最新的发行版,配置环境...
目录结构包括主目录和服务器配置,而配置文件则涉及到核心服务、日志服务、安全服务等关键组件。JBoss还提供了一个Web容器,即Tomcat,允许在同一个服务器上托管Web应用程序。 为了更好地理解JBoss的功能,文档还...
6. **JMS与消息传递**:讨论Java Message Service(JMS)和JBOSS中的消息队列,如何实现异步处理和解耦。 7. **JNDI查找**:解释Java Naming and Directory Interface(JNDI)的工作原理,以及在JBOSS中查找和绑定...
3. **JAVA核心技术**:此项目可能会用到JAVA的多线程技术实现并发通讯,Socket编程实现网络通信,以及JMS(Java消息服务)用于异步处理和消息传递。此外,Spring框架可能用于依赖注入和事务管理,Hibernate或MyBatis...
9. **消息传递**:Spring4.x集成了JMS(Java消息服务),支持消息驱动的架构,允许异步处理和解耦系统组件。 10. **测试支持**:Spring提供了全面的测试工具和框架,包括单元测试、集成测试和端到端测试,便于进行...
它基于Java编程语言,提供了丰富的服务和组件模型,包括Web容器、EJB(Enterprise JavaBeans)容器、JMS(Java Message Service)、JTA(Java Transaction API)等,以支持大规模、高并发的企业应用开发。...
如JNDI(Java Naming and Directory Interface)用于服务定位,EJB(Enterprise JavaBeans)用于构建可复用的企业级组件,JMS(Java Message Service)用于异步消息传递,以及JPA(Java Persistence API)和...
4. JMS(Java Message Service)API:用于在分布式环境中发送和接收消息,实现解耦和异步通信。 5. JDBC(Java Database Connectivity)API:提供连接数据库和执行SQL语句的能力。 Spring框架包含多个模块,其中...
Spring还提供了对消息传递系统的支持,如JMS(Java Message Service),可以实现异步处理和解耦。另外,Spring的Asynchronous Processing和Task Execution特性也是多线程和后台任务处理的重要工具。 安全方面,...
5. JMS:Java Message Service,用于异步通信和消息传递。 二、WebLogic Server安装与配置 安装WebLogic Server通常涉及以下步骤: 1. 获取安装包,根据操作系统选择合适的版本。 2. 执行安装程序,选择安装类型...
5. **JMS API**:javaee.jar或javax.jms.jar提供了Java消息服务(JMS)的API,用于在分布式环境中进行异步通信。 6. **JPA(Java Persistence API)**:包含hibernate-entitymanager.jar等,JPA提供了一种标准的...
Spring 3.x还引入了强大的消息支持,包括JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol)抽象,这使得异步通信和解耦成为可能,提高了系统的可扩展性。 在源码中,读者可能会找到关于以上...
- **JMS(Java Message Service)**:消息传递服务,支持异步通信。 3. **Web开发框架**: 框架可能包含了前端和后端的Web开发工具,如: - **AngularJS** 或 **React**:前端MVC框架,用于构建动态用户界面。 ...