`

JMS小结

    博客分类:
  • JMS
 
阅读更多

写在开头


从一开始接触JMS到现在已经有一个多月了,看完了《ActiveMQ In Action》还有《Java消息服务》这两本书,也有一点心得。 不过最近的一段时间是期中考试,所以很多的时间耽搁了。所以到现在才开始书写这篇文章。

首先一点,为什么要使用JMS


很多时候,我们的程序并不需要使用JMS,或者说消息机制并不需要使用到这个技术,常常使用方法的相互调用即可实现,但为什么需要使用JMS。其实很大程度上是为了追求水平的扩展。举个例子,如果一个服务,或者是一个业务,需要频繁的调用一段函数,而这个函数会形成阻塞,我们肯定会使用分布式的方法进行横向的扩展

还有一个重要的原因就是解藕。之前,我们的业务系统都耦合在一个程序中,我们需要进行一定的解藕,重新基于消息进行架构,所以,我们采用了JMS。用来进行业务上的解藕。

简单的说,生产者只负责生产消息,并且将消息务必送达消息中间件,而消息中间件的作用就是进行消息的持久化,并且在客户端连接上来的情况下,保证消息的务必送达。并且对没有及时处理的消息进行提示,然后人工介入进行处理。

不过有一点,如果是为了在纯Java系统之间进行消息传递,则还可以使用RMI的方式。不一定要使用JMS。

还有一点,JMS之所以是一个接口的集合,而不是一个实现方法,我认为,前人一定是注重这样一种设计方式,而不是具体的实现,也就是说,学习JMS,更重要的是这中间的一系列的思想,而不仅仅是几个工具的使用。这也是我看JMS的原因。

之前的想法


在所谓的JMS系统开发中,我们常常会有一个需求,就是消息发送端需要了解客户端是否已经收到消息,来确保接下来的业务逻辑不会出现大的错误, 假设我们没有使用JMS协议,而是我们自己进行编写消息传递的消息协议,用来确保消息的传递。举一个最简单的例子,我们就可以模仿TCP/IP的 三次握手协议,在每次进行消息传递的时候进行握手操作,并且在之后进行一个放手协议。这样,我们的消息发送方就可以了解到目前业务的进展 情况,并且进入下一步的操作当中。

但是,这样还是会带来一个问题,就是当消息发送之后,客户端接受了,然后进行处理,此时, 网络断了,死机了,怎么办?简单的办法,做一个 超时检测,如果在一定时间没有回复,则认为发送失败。于是进行重发。可行。但是又有一个新的问题,如果一个消息有大概三个操作,客户端在 完成一个操作之后,断开连接,然后新的消息传递到,又需要进行第一步操作,发现是已经完成的,然后常见的程序写法会认为任务已经做完,然后 返回,但实际上这个任务是没有完成的。所以为了避免这种情况,我们可以对消息的运行状况进行一个约定,比如完成第一步,就返回MessageID+StepID

完美,这样消息就能高效的进行处理了。

但是,转念一想,这不就是把业务逻辑绑定到了消息传递中了吗,我们为什么要引入消息传递,很大程度上就是进行解藕,但是看看这个所谓的消息机制完全的就是之前程序的分布式版本,没有一点解藕的迹象。所以这个方法必定是失败的。因为他没有将消息传递的结构性功能发挥出来。

保证消息传送


这可能是JMS最精彩的一点,也是我最关心的地方。在此,我们需要对JMS进行消息传递的过程进行一个梳理。

  • 消息提供者故障 - 消息生产者在生产消息的过程中没有能够将消息发送给消息中间件。
  • 消息消费者故障 - 消息消费者在消费消息的时候并没有返回接受成功,然后崩溃。
  • 消息中间件故障 - 消息中间件直接跪了,消息都没有发送出去。

这上面的情况都是我们在进行消息模型建立的时候经常会遇到,或者说是要进行考虑的问题。

之后将会是JMS协议使用的一些措施。

第一个就是让消息有协议,就是在我们进行系统设计的时候,如何设计我们的确认机制。简单的说,是不是在消费者接受之后立刻返回,抑或是在消费者进行消息消费之后进行返回。这一点上,JMS提供了三种建议。也可以说是一个设置参数,即:

  • AUTO_ACKNOWLEDGE
  • DUPS_OK_ACKNOWLEDGE
  • CLINET_ACKNOWLEDGE

对于第一种,我们可以在下图中得到一个详细的了解,这也是我们最常使用的一个参数,或者说是方法。

将中间的NetWork视为JMS中间件

这个方法将消息的传递分为两个接受独立的行为,即发送给中间件和客户端。这可能是最常用的方式。简单易懂。最重要的就是,"一次而且是仅仅一次"发送。

第二个参数,则给予我们更大的权限,也就是允许重复发送消息。即,如果在实现仅仅一次发送的时候,会产生很大的开销,且,需求可以接受重复的消息,则可以采用这个参数

第三个参数,即是让我们自己定义何时返回ACK,只需要在我们认为需要返回的地方加上message.acknowledge(),即可。这给与了我们充分的自由。

当然,我们还可以使用JMS的事务性特点,这一点,之后会有一篇博文进行介绍。

只要了解了这些思想。即使我们不使用标准的JMS,也可以实现很好的消息框架。比如淘宝的MetaQ和Notify。

New In JMS2.0


  • 异步发送模式 —— 传统的同步模式会导致阻塞,直到收到服务器的应答。与之不同的是,异步模式会直接返回而不会阻塞。一旦收到应答,会调用一个异步回调。新的JMSProducer和遗留版本中对应的MessageProducer都支持异步模式。
  • 延迟消息交付 —— 允许JMS客户端按照预定时间交付消息,支持延期处理。应用可以以毫秒为单位设置最短时间,消息系统在将消息交付给消费者之前必须保留这么长时间。
  • 共享订阅主题 —— 允许可伸缩地消费来自同一订阅主题的消息。
  • 简化API接口

这是JMS十多年来的第一次升级。我们也能从一些变化中看到这几年新的业界标准和新的设计思想。

暂时就这些。之后想到什么在进行编写。

 

转自:http://mikecoder.net/?post=85

 

 

去重(个人观点):

  1. 多使用queue(点对点)
  2. 发送消息成功就去掉生产者中的源消息或转移,也可以用消息计数器
  3. JMS事物管理
分享到:
评论

相关推荐

    logback jms源码分析加用法小结

    《logback jms源码分析及用法小结》 在Java世界中,日志管理是每个项目不可或缺的一部分。Logback作为一款强大的日志框架,因其高效、灵活和可配置性而深受开发者喜爱。本文将重点探讨Logback如何集成JMS(Java ...

    开源项目研究与应用小结.pdf

    ### 开源项目研究与应用小结 #### 一、引言 随着信息技术的快速发展与互联网技术的普及,开源软件在企业级应用中的地位越来越重要。《开源项目研究与应用小结》这一文档提供了关于高并发敏捷WEB架构、消息队列/...

    RMI入门小结

    【RMI(Remote Method Invocation)入门小结】 远程方法调用(RMI)是Java平台上的一个关键特性,它允许Java对象在不同的JVM(Java虚拟机)之间进行通信,从而实现分布式计算。RMI机制使得开发者可以像调用本地方法...

    从Java走向Java+EE+.rar

    1.5 小结 13 第2章 使用Jakarta Commons来简化开发 14 2.1 Jakarta Commons的功能和用法 14 2.2 小结 18 第3章 Java EE容器 19 3.1 什么是容器 19 3.2 Tomcat的安装和使用 20 3.3 小结 25 第4章 在...

    Spring in Action(第2版)中文版

    目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...1.5小结 ...2.6小结 ...3.7小结 ...4.6小结 ...5.8小结 ...6.5小结 ...7.7小结 ...8.6小结 ...9.6小结 ...b.4小结

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结

    JBPM4工作流应用开始指南.rar

    41 2.9.5 导入和使用范例 41 2.10 例程:jBPM HelloWorld 43 2.11 小结 45 第3章 使用jBPM图形化流程设计器(GPD)设计流程 46 3.1 创建一个新流程 47 3.2 编辑流程定义源 49 3.3 例程:设计一个“复杂的”业务流程 ...

    Java数据编程指南

    J2EE通信 通信概述 JMS的详细情况 消息驱动EJB 小结 第24章 Java数据对象(JDO) 概述 JDO对象模型 JDO API JDO实例的生命周期 JDO和EJB 开发可持久类 范例应用程序 配置FFJ...

    Java测试新技术TestNG和高级概念.part1

    1.5 本章小结 第2章 测试设计模式 2.1 针对失败而测试 2.2 工厂 2.3 数据驱动测试 2.4 异步测试 2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 ...

    Java测试新技术TestNG和高级概念.part2

    1.5 本章小结 第2章 测试设计模式 2.1 针对失败而测试 2.2 工厂 2.3 数据驱动测试 2.4 异步测试 2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 ...

    J2EE应用开发详解

    第1章 Java Web应用开发简介 1 1.1 Java EE应用概述 1 1.2 Java EE概念 1 1.2.1 Java EE多层模型 1 1.2.2 Java EE体系结构 2 1.3 Java EE的核心API与组件 4 1.4 Web服务器和应用服务器 13 1.5 小结 16 第2章 建立...

    RMI使用学习 小结

    RMI(Remote Method Invocation,远程方法调用)是Java提供的一种用于实现分布式计算的技术,它允许在不同的Java虚拟机之间透明地...然而,对于大型和复杂的分布式系统,可能需要考虑其他技术,如JMS、Hadoop、Akka等。

    java实现消息队列的两种方式(小结)

    Java消息队列(Java Message Queue,简称JMS)是一种用于应用程序之间异步通信的技术,它允许应用程序通过消息传递数据,而无需直接调用彼此。在本文中,我们将探讨两种使用Java实现消息队列的方式,分别是利用...

    Spring攻略(第二版 中文高清版).part2

    1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 ...

    Spring攻略(第二版 中文高清版).part1

    1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 ...

    Java事务的个人理解小结

    JTA事务通常配合JMS(Java Message Service)和其他EJB(Enterprise JavaBeans)组件一起使用,以实现更复杂的事务处理需求。 3. **容器事务**:在Java EE(现在称为Jakarta EE)环境中,容器(如应用服务器)负责...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 ...15.13 小结

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

Global site tag (gtag.js) - Google Analytics