[jms那点事儿] JMS ( java message service )入门 + activemq消息持久化

原创 2011年01月11日 12:42:00

JMS 即 java message service 是为java提供了一种创建、发送、接收消息的通用方法。可以将复杂的系统进行业务分离,变成灵活的高度解耦合的布局。同时对我们的日常业务需求开发,提供了非常灵活的业务解决方案。比如缴费还款送积分,送积分的业务逻辑不能影响到缴费还款的业务逻辑,所以最好的,就是缴费/还款逻辑执行完成之后,通过一种方式告诉积分系统,给用户发送积分,发送积分的结果不要影响到复杂的缴费还款的过程。这种情况下,采用jms进行异步处理,便是一个很好的选择。

要使用消息的方式来进行系统交互,我们需要一个消息中间平台,来进行消息的接受转发,同时处理复杂的消息持久化等问题。本文我们采用activemq来做实验。这样的架构下,我们的系统通常会变成如下架构:

 消息产生者 -> 消息中心 -> 消息消费者

1、消息的两种传播方式

JMS支持两种消息传播:PTP 和 PUB/SUB

PTP : 点对点发送。消息的发送方将消息放入管道中,消息的接收方从管道中取出消息并处理。

PUB/SUB : 发布/订阅方式。消息的发布者将自己的主题放入消息中心,同时进行消息投递,消息订阅者只获取自己订阅的消息。

jms为了支持上述两种模式,提供了两套针对同样接口的实现,对照关系如下:

 

ConnectionFacatory:被管理的对象,由客户端(发布者/接受者)使用,用来创建一个链接。

Connection:提供一个JMS消息的活动链接。

Destination:封装了消息目的地,或者主题类型。

Session:一个用来发送和接受消息的线上上下文。

MessageProducer:由session创建的,用来发送消息的对象。

MessageConsumer:由session创建的用来接受消息的对象。

2、jms消息模型

Jms的消息分为三部分:消息头、消息属性、消息体

消息头:包含了消息的客户端和提供者用来路由和识别消息的数据。

 消息头包含的字段:

 JMSDestination:包含了消息发往的目的地或者主题信息。

 JMSDeliveryMode:消息传送模式。spring提供额jms模板提供了2种模式(有默认模式):DEFAULT_DELEVERY_MODE 默认模式、DEFAULT_PRIORITY、DEFAULT_TIME_TO_LIVE

 JMSMessageID:消息标示,唯一性,每个消息都不同,即便是承载者相同消息体的消息。

 JMSTimestamp:发送时间

 JMSCorrelationID:与当前消息关联的其他消息的标示

 JMSReplyTo:回复消息的目的地。带有这样属性的消息通常是发送方希望有一个响应,这个响应是可选的。

 JMSRedelivered:带有该字段的消息通常过去发送过但是没有被确认,如果要再次发送,提供者必须设置该字段。如果true,则消息接受者必须进行消息重复处理的逻辑。

 JMSType:消息类型标示。官方文档的解释:

 

JMSType头字段包含了由客户端在发送消息时提供的消息类型标识。一些消息提供者使用消息库来存储由应用发送的消息定义。type头字段可以引用提供者库中的消息定义。JMS没有定义一个标准的消息定义库,也没有定义这个库中所包含的各种定义的命名策略。一些消息系统要求每个被创建的应用消息都必须有一个消息类型定义,并且每个消息都指定它的类型。为了能够使JMS工作于这些消息系统提供者,无论应用是否使用,JMS客户端最好赋值JMSType ,这样可以保证为需要该头字段的提供者提供了正确的设置。为了保证移植性,JMS客户端应使用安装时在提供者消息库中定义的语义值作为JMSType的值。 

 

 JMSExpiration :过期时间。

 JMSPriority:优先级。

消息属性:包括了标准投资段之外的额外添加给消息的可选的字段。比如 应用指定的属性。

消息体:消息携带的内容。

3、消息传输编程步骤

 1)使用jndi获取一个ConnectionFacatory对象;

 2)使用jndi获取一个或者多个Destination对象;

 3)使用ConnectionFactory创建一个JMS连接;

 4)使用连接创建Jms session;

 5)使用session和destination创建MessageProducers和MessageConsumers

 6)使用Connection进行传输消息;


上述是jms的基础知识,简单了解可以便于下面的应用。jms本身提供了jar可以下载并使用相关配置,结合消息系统来完成消息的发送和接受等操作。但是一种便捷的方式,为加快开发,可以使用spring提供的jms模板,即JmsTemplate,这个类似于jdbcTemplate。

我们演示PTP和PUB/SUB两种模式的配置。

先看下基础公用的类:

我们定义:消息发送者、消息接受者、消息转换器

第一种,PTP方式的配置:

第二种:PUB/SUB方式的配置

我们配置两个消息订阅者,分别订阅不同的消息,这样用于判断是否成功执行了消息的发布和消息的订阅

 

单元测试代码:

测试结果执行便可。

在这里,消息系统我们采用的是activemq,试想一个问题,如果消息过多,这个时候发生了宕机,消息是否会丢失?

这里就涉及到了一个新问题,即消息持久化。

activemq的消息持久化分成两种:文件和数据库(支持mysql/oracle)。可以再其配置文件中进行配置,activemq配置文件采用的是spring的方式,所以配置起来非常的方便。

通常下载了activemq后,会有一系列的配置文件demo,可以参照其中的样例修改即可。

这里我们使用mysql作为消息持久化的数据库服务器。

将mysql的驱动包,拷贝到activemq的lib目录,配置如下:

conf/activemq.xml

特别注意的是,这里指定的数据库名称,需要事先在mysql中创建好schema。

运行activemq,可以发现自动创建了三张表:

activemq_acks

activemq_lock

activemq_msgs

JMS之activemq消息持久化

JMS 即 java message service 是为java提供了一种创建、发送、接收消息的通用方法。可以将复杂的系统进行业务分离,变成灵活的高度解耦合的布局。同时对我们的日常业务需求开发,提供...
  • zmx729618
  • zmx729618
  • 2016年07月19日 10:46
  • 920

ActiveMQ持久化方式

消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和...
  • kobejayandy
  • kobejayandy
  • 2016年02月25日 11:38
  • 4633

ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系

①DeliveryMode 这是传输模式。ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent delivery),默认情况下使用的...
  • wenlixing110
  • wenlixing110
  • 2016年11月04日 10:20
  • 2863

ActiveMQ订阅模式持久化实现

我的诉求是,建一个订阅通道,然后多个客户端监听,当某个客户端掉线后,再上线的时候可以收到它没有接收到的消息。 本文主要参考了《使用Spring配置ActiveMQ的发布订阅模式》(http:...
  • fulai0_0
  • fulai0_0
  • 2016年08月05日 11:37
  • 4136

ActiveMQ的几种消息持久化机制

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。 ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久...
  • lr131425
  • lr131425
  • 2017年03月29日 14:36
  • 961

ActiveMQ将消息持久化到数据库

需求描述:将ActiveMQ消息持久化到mySql\Oracle数据库中 ; 环境描述:目前最新版本是ActiveMQ5.13.2,本文讲述的实例是ActiveMQ5.9.0。 使用默认的持久化机制,...
  • boonya
  • boonya
  • 2016年04月27日 10:41
  • 4210

ActiveMQ持久化方式

ActiveMQ持久化 消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发...
  • xyw_Eliot
  • xyw_Eliot
  • 2013年06月19日 14:01
  • 11334

消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)

消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
  • wangshuxuncom
  • wangshuxuncom
  • 2014年12月25日 14:34
  • 3928

通过Oracle数据库向ActiveMQ发送JMS消息

转自:http://blog.synyx.de/2011/10/sending-jms-from-oracledb-to-external-activemq-broker/。   Send...
  • linjinxiao
  • linjinxiao
  • 2013年02月05日 10:14
  • 1227

Spring整合JMS——MessageConverter介绍

转:http://haohaoxuexi.iteye.com/blog/1900937 1.4     消息转换器MessageConverter MessageConverter的作用主要有...
  • s296850101
  • s296850101
  • 2016年08月30日 11:53
  • 598
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[jms那点事儿] JMS ( java message service )入门 + activemq消息持久化
举报原因:
原因补充:

(最多只允许输入30个字)