`
hujin1979
  • 浏览: 80139 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

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双系统应用

    5. **连接工厂与会话**:JMS应用需要创建连接工厂来建立与消息服务器的连接,然后通过连接工厂创建会话,处理消息的发送和接收。 6. **消息目的地**:定义消息的发送目标,可以是队列或主题。 7. **消息的持久化**...

    02-JMS熟练应用.pdf

    - **JMS 1.0** 定义了两个领域特定的API:一个针对点对点消息传递(队列),另一个针对发布订阅消息传递(主题)。虽然这些仍然作为向后兼容的一部分存在于JMS中,但它们已经被后续版本的API所取代。 - **JMS 1.1*...

    maximo的JMS配置

    Maximo 是一款功能强大的资产管理软件,广泛应用于企业级的设备维护与管理领域。为了实现与其他系统的无缝对接,Maximo 支持多种消息传递机制,其中 Java 消息服务(JMS)是一种常用的选择。本文将详细介绍如何在 ...

    jms-1.1.jar

    在Java开发领域,消息服务(Java Message Service,简称JMS)扮演着至关重要的角色,它为应用程序提供了一种标准的方式来创建、发送、接收和读取消息。JMS 1.1.jar是JMS规范的1.1版本实现,它为开发者提供了API接口...

    JMS 使用 ActiveMQ 传送文件

    在IT领域,Java消息服务(Java Message Service,简称JMS)是一种标准API,它允许应用程序创建、发送、接收和读取消息。这种技术常用于异步通信,尤其是在分布式系统中,使得不同组件之间可以解耦并独立工作。...

    java的应用领域 操作符

    在Java的应用领域中,它扮演着至关重要的角色。以下是一些主要的Java应用领域及其详细解释: 1. **Web开发**:Java在构建动态网站和企业级Web应用程序方面非常流行。它通过Java Servlets、JavaServer Pages (JSP)、...

    ActiveMQ 中javax.jms的源码 javax.jms-sources-1.1.zip

    在Java消息服务(Java Message Service,简称JMS)领域,javax.jms是核心API,它定义了应用程序与消息中间件进行交互的一组接口和类。ActiveMQ作为开源的消息中间件,广泛应用于分布式系统中,提供了对JMS规范的实现...

    MQ、JMS以及ActiveMQ关系的理解

    总的来说,MQ、JMS以及ActiveMQ是现代分布式系统和企业级应用中不可或缺的组件,它们提供了灵活、可靠和高效的消息传递机制,使开发者能够在不同应用程序和服务之间实现有效的解耦合、异步处理和消息传递。...

    JMS583方案原理图参考手册

    综上所述,JMS583方案不仅涉及到了USB 3.1与PCIe的接口转换,还涵盖了芯片封装、电源管理、信号完整性等多个关键领域,对于理解和实现高效、可靠的USB-M.2桥接系统具有重要的指导意义。通过详细阅读和理解提供的参考...

    JMS在电子商务中的应用

    此外,它还增强了JMS应用系统在同一个消息传递域内的不同JMS提供者之间的可移植性。 ##### 2.1 JMS消息处理模型 JMS API支持两种主要的消息处理模型: 1. **点对点(Point-to-Point, PTP)**: - 在这种模型中,...

    spring整合jms+activemq

    在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,而JMS(Java Message Service)则是一种标准接口,用于在分布式系统中进行异步消息传递。ActivemQ是Apache软件基金会的一个项目,它实现了JMS规范,...

    JMS标准规范培训教程

    **正文** JMS(Java Message Service)是...SUN JMS 1.1规范是这个领域的基础,而SUN MQ则是这个规范的一个实现例证。通过深入学习"JMS规范培训教程",开发者能够更好地理解和应用JMS,构建高效、稳定的分布式系统。

    国产化中间件产品对接,jms的接口参考

    部署JMS应用程序`JmsDemoTLQRA.war`到TongWeb的samples/jms目录,这通常是一个包含发送和接收消息功能的Web应用程序,可以验证JMS配置是否正确。用户可以通过访问特定URL来发送(`...

    javax包下的javax.jms.jar及servlet-api.jar

    **Java消息服务(JMS)**是Java平台上的一个标准接口,它允许应用程序创建、发送、接收和读取消息。`javax.jms`包提供了与消息传递系统交互所需的接口和类。JMS主要应用于分布式环境中的异步通信,它支持点对点...

    JMS详细实例学习教程

    JMS 广泛应用于分布式系统、企业集成、消息队列、异步通信等领域。JMS 的应用场景包括: * 分布式系统:JMS 可以用于分布式系统中的异步通信,实现系统之间的解耦。 * 企业集成:JMS 可以用于企业集成中,实现不同...

    Java网络编程--基于Spring的JMS编程

    JMS是一个标准接口,它允许应用程序创建、发送、接收和读取消息,这些消息可以在不同的应用之间传递,从而实现异步通信。 Spring框架对JMS的支持主要体现在以下几个方面: 1. **Spring JMS抽象层**:Spring提供了...

    jms规范2.0(中英文都有)

    JMS规范2.0版是这个领域的最新标准,它为开发者提供了在分布式环境中可靠地发送和接收消息的接口。这个压缩包包含了JMS 2.0的中英文文档以及相关的JavaDoc,有助于开发者深入理解和使用JMS API。 首先,我们来详细...

    JMS1.1规范中文版

    - **与Java命名和目录接口API (JNDI) 的关系**:JNDI提供了查找和引用JMS资源的能力,是实现JMS应用的基础。 - **与J2EE平台的关系**:JMS是J2EE平台的一部分,与其他J2EE技术(如EJB、JDBC等)协同工作,共同支持...

    Programming WebLogic JMS

    创建JMS应用程序 - **配置JNDI环境**:首先需要配置JNDI(Java Naming and Directory Interface)环境,以便应用程序能够查找和使用JMS资源。这通常通过WebLogic控制台完成。 - **创建连接工厂**:定义一个JNDI名称...

Global site tag (gtag.js) - Google Analytics