`
iwindyforest
  • 浏览: 235091 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JMS实践总结

 
阅读更多

from: http://www.blogjava.net/jjwwhmm/archive/2008/06/26/210840.html

by: Pony

 

1.消息类型的选择
Java的JMS消息类型有文本类型,对象类型,字节类型,流类型,XML类型,在实际项目中,用的最多的是文本类型,对象类型和xml类型的消息.建议 最好不用对象类型,因为如果用对象类型的话,调试的时候是很麻烦的,首先你必须要写专门的测试代码用来发送消息,第二,必须要管理对象所属的类的不同版 本,第三,不方便查看queue或者topic中的消息内容.而如果使用文本类型或者xml类型的消息,那么可以很容易的通过JMS中间件提供的一些管理 工具来发送测试消息,查看消息内容,并且更加容易管理不同版本之间的兼容性.如果一定要用对象类型消息的话,建议使用xstream把对象转化为xml

2.是使用queue还是topic?
这两者的定义是很清楚的,也很容易区分.但是在实际项目中,如何来取舍呢?我的建议是尽量用queue.如果你的项目用到了JMS,那么你的系统也应该是 到了需要部署在集群环境的规模了.用topic在集群环境下会带来很多麻烦.举个简单的例子,如果你是用MDB来处理topic的消息,你有一个MDB名 为SampleMDB,它以集群的方式分别部署在A服务器和B服务器上.那么有可能同一条topic消息被同一个MDB处理两次.虽然一些JMS中间件提 供商为解决这种问题提供了一些解决方案,例如把subsriber分组,但是它为开发和调试都带来了很大的麻烦.topic消息的处理也要比queue的 复杂,很难跟踪topic消息的处理过程.
那么,如果不用topic的话,怎么来实现topic这种性质的消息处理呢?可以写一个消息转发器,把一个queue上的消息转发给所有关注这个 queue的其它queue中.例如,有一个queue,名为SampleQ1,一个消息发送者sender,一个消息转发器router,有三个 handler A,B,C需要处理这个queue中的消息.那么,sender发送消息到SampleQ1,router接收SampleQ1的消息后分别发送到 SampleQ1_A,SampleQ1_B,SampleQ1_C,handler A,B,C分别从队列SampleQ1_A,SampleQ1_B,SampleQ1_C中接收消息.

3.用JMS来解决什么问题?
一提起JMS可以做什么,第一想到的就是异步处理.面试的时候问JMS可以做什么?大多数的回答是:用JMS来异步发送邮件!(到底应该怎么样构建一个邮 件发送系统不是本文的主题,以后有时间我会专门来谈谈在我的项目中,我是怎么来设计邮件发送系统的).其实,还可以用JMS来解决很多复杂的问题,例如分 布,并发,系统解耦,负载均衡,热部署,触发器等等,这些复杂的问题因为引入了JMS而变的更加简单.下面简单介绍下解决分布,并发问题的场景.
3.1 用JMS来解决并发问题
queue的概念大家都很清楚了,那就是queue里的一条消息只会被一个消息接收者处理.基于这个概念,我们可以在系统中对并发要求很严格的模块中引入 JMS的使用.例如,系统的送积分,一般这个模块是用一个定时器,例如quartz,每天定期查询数据库,如果发现有满足条件的记录,那么就把积分送给会 员.如果同时有多个quartz在运行,那么必须严格控制防止并发的对同一条记录送多次积分.解决这个问题有很多方法,可以通过业务的设计,系统的部署, 数据库的设计,事务的控制等方法来实现,在这里提一个用JMS来解决问题的方法:在插入记录的同时发送一个queue的消息.这样即使有多个送积分的 MDB实例在运行,也只会被一个实例处理.

3.2用JMS来解决分布的问题
解决分布有两种类型,第一种是指消息是集中的,但消息的处理是分布的.例如,系统可能会被分为前台与后台,这两个系统是部署在不同的网段里的.那么怎么把 前台发生的业务通知后台系统呢?当然,可以通过一个类似定时器的玩意定期去数据库查询.但这种方式要么就是浪费系统资源,可能在定期查询中80%的时间都 是在做无用功,要么就是业务请求没有被及时处理.,因为定期的时间总是有一个时间间隔的.用JMS来处理这个问题会怎么样呢?前台系统在处理完业务请求后 的同时发送一个消息到queue中,后台系统的消息接收者接收到消息后立即处理.这里消息的处理也可能有一定的延期,但这主要取决于消息服务器的硬件能 力,网络带宽,消息接收者的处理速度等.

第二中是指消息也是分布的.很多消息中间件都提供了消息路由的功能,即消息发送到一个消息服务器后,这个消息服务器根据定义的规则再把这条消息路由转发到 其它的消息服务器.例如,可能在北京的一个数据中心部署了数据采集系统,采集到数据后以消息的方式发送到消息服务器,然后消息服务器再把这条消息路由到上 海的数据中心,再由上海数据中心部署的数据处理系统来处理这条消息.

4.JMS与事务,一定要用JTA事务吗
很多人接触到JTA事务都是从用JMS开始的,毕竟同时要连多个数据库的的系统并不是那么的多!而要用JTA事务的话,就得要在笨重的应用服务器中部署. (当然,你也可以用类似atomikos的轻量级JTA事务管理器),更重要的是,并不是事务本身的技术有多复杂,而是事务的界定,这种事务的界定有时都 不是程序员能决定的事情,需要在设计的时候就要考虑清楚,甚至可能还需要业务人员的参与.(题外话:经常问面试的,用spring的aop做什么?大多数 答:用来管理事务!事务要真这么简单该多好啊!)
我也不是要反对用JTA事务,而是要说明一下,用JMS,并非一定要用JTA事务.这可以分为三种场景:
一,必须用JTA事务,这种情况下,一般消息的接收者只从消息本身获得数据并进行处理.所以必须要保证消息的发送与所依赖的业务保持一致.
二.不需要用事务,这种情况下, 要么是业务无关紧要,例如用JMS来记录日志.要么是发送的消息仅仅是一个作为后续业务处理的一个触发器!消息接收者仅仅是从消息中获得一个id,然后根 据这个id去查询所依赖的其它数据进行业务处理.即使消息丢失也没关系,可以通过其它的机制来补偿.
三.消息丢失可以通过补偿事务来完成.这个依赖与具体实现,就不详细说了.

5.处理消息永远比发送消息慢!
要保证你的JMS应用稳定的运行,那么你必须在开发,部署的时候时刻重视这个问题.
首先,需要把发送消息的连接池与接收消息的连接池分开.以避免接收消息的连接过过而导致发送消息的应用拿不到连接.
在一个连接上并发的处理消息,而不是连接打开,处理一个消息,马上关闭连接.
合理的设置消息的过期时间,否则消息日积月累,最终超出queue的size
对于非关键业务的消息处理,可以采用异步处理的方法:接收到消息后并不是立刻处理,而是放到一个任务池或者线程池中处理.如果消息处理失败,则把消息重新发送回队列中.

分享到:
评论

相关推荐

    JMS学习笔记精心总结

    **JMS学习笔记精心总结** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准接口。它允许应用程序创建、发送、接收和读取消息,使得应用程序能够在不直接连接的情况下...

    jms-1.1.jar

    总结,JMS 1.1作为Java平台上的消息服务标准,提供了一套强大且灵活的框架,促进了分布式系统之间的高效、可靠通信。无论是简单的企业内部应用还是复杂的跨组织协作,JMS 1.1都能够胜任。了解并熟练运用JMS,对于...

    JBOSS建立JMS应用实例

    总结来说,JBOSS中的JMS应用实例涉及了JMS的基本概念、JBOSST的配置、代码编写以及具体的应用场景。通过实践这些步骤,开发者可以掌握如何在JBOSST环境中利用JMS进行高效的数据通信。同时,提供的文档和项目文件为...

    spring_jms

    总结起来,这个"spring_jms"实例旨在帮助初学者了解如何在Spring应用中使用JMS进行异步通信。通过结合Maven、Spring框架和ActiveMQ,我们可以构建一个高效、可靠的分布式消息系统,提升应用的性能和灵活性。通过深入...

    JMS教程

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在分布式环境中传递消息,实现应用程序之间的异步通信。...阅读“JMS教程.pdf”将更深入地了解JMS的细节和实践技巧。

    javax.jms.jar包与JMS实例代码

    总结起来,`javax.jms.jar` 包提供了Java开发人员与JMS兼容的消息中间件进行通信的工具,而`demo` 文件中的实例代码展示了如何在实际应用中使用这些工具。通过学习和实践这些示例,你可以更好地理解和掌握Java消息...

    ActiveMQ在JMS中的运用-深入浅出JMS

    总结来说,JMS和ActiveMQ为分布式系统提供了一种健壮的消息传递机制,使得组件间的通信变得简单、可靠。ActiveMQ作为JMS的一种实现,不仅提供了丰富的特性和功能,而且易于集成和管理,是构建高效消息系统的理想选择...

    jms1.1.jar.zip

    《JMS 1.1 API详解与应用实践》 Java消息服务(Java Message Service,简称JMS)是Java平台中用于在分布式环境中传递消息的标准API。JMS 1.1作为其一个重要版本,为开发者提供了可靠的异步通信能力,使得应用程序...

    jms培训PPT

    总结来说,JMS作为Java平台上的消息中间件标准,为分布式系统中的组件间通信提供了强大的支持。理解和掌握JMS对于开发高可靠、高性能的企业级应用至关重要。通过学习和实践,我们可以利用JMS来提升系统的可扩展性、...

    test_jms.zip_activemq_activemq案例_jms_jms test

    描述"jms简单的案例,用的activemq,使用jms前请先启动activemq服务器"表明这是一个初级的JMS实践,涉及到使用ActiveMQ作为服务器,而且在运行任何JMS相关的代码之前,需要确保ActiveMQ服务已经启动。 **ActiveMQ与...

    Programming WebLogic JMS

    ### 编程WebLogic JMS:深入理解与实践 #### 一、引言 随着企业级应用对消息处理的需求日益增长,Java消息服务(JMS)作为一种标准的消息中间件技术,已经成为开发分布式应用的重要组成部分。BEA WebLogic Server...

    JMS-activemq 实例(分ppt,eclipse工程,说明三部分)

    总结来说,这个压缩包文件提供了全面的学习资源,涵盖了理论讲解(PPTX)、实践操作指导(Readme)以及可运行的示例代码(Eclipse工程),对于想要了解和掌握JMS与ActiveMQ的开发者来说,是一个非常宝贵的资源。...

    编码实现MQ连接池实现JMS消息发送连接管理

    在IT行业中,消息队列(Message Queue,简称MQ)是一种重要的中间件,它允许应用程序之间异步通信,提高...实践中,结合具体的JMS提供商和连接池实现库,可以进一步定制和优化连接池策略,以适应不同业务场景的需求。

    JMS开发例子.rar

    总结来说,JMS是Java平台用于企业级消息传递的重要工具,它允许应用程序之间进行高效、可靠的数据交换,无论它们是否同时运行。"JMS开发例子.rar"中的内容应该会详细解释JMS的使用方法,为初学者提供了一个宝贵的...

    Lab2-JMS-code_jms_brainhht_

    总结来说,这个实验旨在让你掌握Java JMS API的使用,包括创建消息、设置消息属性、发送和接收消息,以及理解队列和主题的区别。通过实际操作,你可以更好地理解JMS如何在分布式系统中实现可靠的消息传递,并为构建...

    JMS简明教程--简体中文

    总结,JMS是Java平台中用于构建健壮、高效的企业级消息传递系统的标准工具。理解和掌握JMS的概念和API,能够帮助开发者在分布式环境中构建稳定、可扩展的应用程序。通过阅读"JMS简明教程.pdf",你可以进一步深化对...

    SpringBoot JMS(ActiveMQ) 使用实践.docx

    SpringBoot集成ActiveMQ是企业级应用中常见的技术实践,它使得在Java应用程序中处理消息传递变得简单。在本文中,我们将深入探讨如何在SpringBoot中使用JMS(Java Message Service)与ActiveMQ进行通信,包括两种...

Global site tag (gtag.js) - Google Analytics