转
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
对于非关键业务的消息处理,可以采用异步处理的方法:接收到消息后并不是立刻处理,而是放到一个任务池或者线程池中处理.如果消息处理失败,则把消息重新发送回队列中.
http://betafox.iteye.com/blog/608437
分享到:
相关推荐
此外,用户可以使用WebLogic的Configuration Wizard工具进行JMS相关配置。 消息桥是JMS提供的一种机制,通过它可以与外部消息提供商实现即插即用的集成。消息桥支持采用MQ适配器实现全面的MQJMS支持。同时,消息桥...
通过阅读《有关JMS的一点看法》、《Apache Geronimo的JMS实现:ActiveMQ》等文章,我们可以深入理解JMS的使用场景、优缺点以及最佳实践。同时,《JAVA基础:什么是JMS》和《JMS简介》等资料可以帮助我们系统地了解...
在这个"JMS相关的Source"中,我们可以看到是关于JMS与JBoss应用服务器以及Spring框架集成的代码示例。 首先,JBoss是一个开源的应用服务器,它支持多种Java EE规范,包括JMS。在Jboss中,JMS服务通常通过 HornetQ ...
在**学习笔记** 中,可能详细记录了学习JMS的过程,包括理解JMS的基本概念、设置开发环境、编写代码示例、遇到的问题及解决策略,还有可能对如何应用JMS在实际项目中进行了探讨。 通过阅读**jms学习笔记.docx** 和 ...
**JMS学习教程概述** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准API。它允许应用程序创建、发送、接收和读取消息,为分布式系统提供了可靠的、跨平台的通信...
在描述中提到的接收端和发送端的部署步骤,主要是创建Spring配置文件(如`spring-jms.xml`)来管理JMS相关的bean,以及在`web.xml`中配置监听器以加载这些配置。这些配置文件定义了消息的生产者和消费者,以及它们...
标题中的"jms.rar_jar j_java jms_jms_jms jar_jms.j"可能是指一个包含JMS相关代码和资源的压缩文件,其中包含了`.jar`文件,可能是实现JMS功能的库或示例代码。"jms.jar"可能是一个封装了JMS API的Java类库,而"jms...
“工具”标签则可能意味着ActiveMQ作为工具被介绍,同时博主可能也提到了其他与JMS相关的工具或库。 **文件名称列表:** 1. **JMS、XML和异构企业--使用JMS和XML来促进企业应用的互操作性.doc** - 这份文档可能...
由于标签包含了“源码”和“工具”,这篇博文可能深入解析了JMS的实现细节,或者介绍了与JMS相关的开发工具,如消息代理(message broker)如Apache ActiveMQ、RabbitMQ等,或者是用于测试和调试JMS的工具。...
2. 配置JMS资源:在JBOSST的配置文件(如standalone.xml或domain.xml)中,需要添加JMS相关的配置,包括连接工厂、队列和主题等。 三、创建JMS应用 1. 创建JMS模块:在JBOSST中,JMS模块定义了消息服务的配置,包括...
在本文中,我们将深入探讨如何使用...这个实例对于学习和理解JMS以及如何在实际项目中应用它是很有帮助的。通过这个实例,开发者可以进一步掌握异步通信、消息中间件的使用,以及Spring MVC和ActiveMQ的整合技巧。
在提供的“jms英文书小合集”中,我们可以预见到一系列关于JMS的详细学习资源,包括`javaMail`、`JMS`以及`ActiveMQ`的相关书籍。这些书籍将深入探讨以下几个关键知识点: 1. **JavaMail**: JavaMail是Java编程语言...
JMS实例代码通常会涉及到异常处理,如JMSException和其他相关的运行时异常,确保在出现问题时能够优雅地处理错误。此外,为了提高性能和可用性,可以使用事务管理(Session的TRANSACTED或CLIENT_ACKNOWLEDGE模式)...
本项目提供的下载资料可能包含Spring配置文件、Java源代码、测试脚本等,可以帮助学习者了解如何在实际项目中使用Spring与WebLogic JMS的集成。通过深入研究这些文件,你可以了解到如何在企业级环境中利用消息队列...
JMS提供者负责消息的存储、转发以及相关管理功能。 4. **管理对象**:这些是预定义的JMS对象,客户使用它们进行消息的发送和接收。 #### 四、JMS的高级接口 JMS定义了一系列高级接口来封装各种消息的概念。这些接口...
- **配置文件**:如`applicationContext.xml`,可能包含Spring和JMS的相关配置。 - **Java类**:可能有消息生产者、消费者类,以及可能的业务逻辑类。 - **测试类**:用于验证消息发送和接收功能的正确性。 5. *...
2. `applicationContext.xml`:Spring的配置文件,定义了bean的定义和它们之间的依赖关系,包括JMS相关的配置。 3. 消息生产者类:使用`JmsTemplate`或自定义`MessageProducer`发送消息到队列或主题。 4. 消息消费者...
这份"JMS1.1规范 中文版"的文档无疑是学习JMS的重要参考资料,尤其对于那些不熟悉英文原版规范的中文读者来说,更是宝贵的资源。 JMS的核心概念包括消息生产者、消息消费者和消息代理。消息生产者是发布消息的应用...
本教程通过视频形式深入讲解了ActiveMQ的使用和JMS规范的相关知识。 Java消息服务(JMS)是Java平台中用于企业级应用集成的API,它定义了一组标准接口,使得应用程序可以与各种消息队列系统进行交互。JMS的核心概念...
标题中的"JMS所需jar包"指的是实现JMS规范所必需的库文件,这些jar包通常包含了JMS API和其他相关的类库,使得开发者可以在Java环境中使用JMS功能。在描述中提到的"官方最新版 JMS 5.11jar包",可能是指ActiveMQ的一...