文档章节

(一)ActiveMQ初体验之消息发送

 是谁把我变成了码农
发布于 2015/07/15 16:59
字数 1565
阅读 42
收藏 0

说在前面的话:在讲述下面例子的时候我假设已经搭建好了ActiveMQ消息服务器,而且我测试的项目采用了maven管理也添加好了各种包的依赖。


第一步:先创建一个ConnectionFactory实例 ConnectionFactory是生产创建Connection的工厂 ConnectionFactory是JMS提供的一个标准化的接口,并没有提供具体的实现 而是有具体的JMS提供者去实现 ,从而创建具体的ConnectionFactory。 在这里我们的JMS提供者是ActiveMQ所以连接工厂的创建也应该有ActiveMQ提供。ActiveMQ的为我们提供了 ActiveMQConnectionFactory 这个类实现了ConnectionFactory接口 并且负责创建Connection。 在创建ActiveMQConnectionFactory的时候我们可以指定ActiveMQ的地址、用户名和密码等相关信息。如果我们采用无参的构造函数就会使用默认的地址和用户信息,在这里我们使用默认的地址和用户信息

//ConnectionFactory cf=new ActiveMQConnectionFactory(userName, password, brokerURL);
ConnectionFactory cf=new ActiveMQConnectionFactory();

第二步:当创建好了ConnectionFactory之后,我们就需要创建Connection,上面提到Connection的创建是由ConnectionFactory创建的。一个ConnectionFactory被创建之后 我们调用它的createConnection方法就可以直接创建出Connection对象

Connection connection=cf.createConnection();

第三步:当创建好连接之后我们可以选择性的启动这个Connection,事实上如果作为消息发送者来说的话我们在这里是可以不启动的。因为当我们发送消息的时候,如果没有启动连接ActiveMQ客户端会帮我们自动的启动。但是如果是接收消息的话,我们就必须显示的调用connection.start()来启动,否则就会抛出JMSException

connection.start();

第四步:创建完了Connection,我们就可以用Connection创建Session当然我们直接调用connection.createSession()方法来完成session的创建。 在这里我们不得不说一下createSession的两个参数 第一个参数 为 boolean transacted, 这个参数的意思是是否启用事务,如果设置为ture的情况下当我们调用发送消息之后 必须提交事务,否则我们的消息是不会发送出去的,这里事务的体积通过session.commit()来完成。在这里我们先设置我false 也就是说不启用事务。第二个参数是用来标记消费者的应答情况在Session接口中有几个常量定义了应答的方式 1)Session.AUTO_ACKNOWLEDGE 代表消费者消费消息以后自动应答 使用这种情况就是我当我们的消费者 一旦接收到消息就可以理解为已经成功消费;2)Session.CLIENT_ACKNOWLEDGE 这种应答方式声明了当消费接收到消息的时候有消费者确定什么时候应答,换句话说就是我们把消息成功处理以后 必须告诉JMS消息服务器我们已经处理完成。实际上这种情况才是生产环境经常用到的。

Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);

第五步: session创建完成以后我们就可以利用session创建destination了,在这里强调说明一下desination是一个没有任何方法的接口,他只是为了声明消息的目的地,有两个具体的接口直接集成了Desination接口,分别是Queue和Topic 这两种接口代表了两种消息类型。Queue代表的P2P(端对端)的消息类型 Topic代表了订阅发布模式(具体参考JMS规范)这两种具体类型的创建分别是调用session.createQueue()和session.createTopic()来完成了,方法的参数都是一个字符串类型代表是JMS服务器存放消息的地址,但是我调用的create的方法并不是每次都去创建一个新的消息地址,实际上如果这个消息地址已经存在了那只是获取这个消息地址,反之创建。

Destination destination= session.createQueue("test");

第六步:我们通过session创建了消息的目的地(消息地址)以后我们还需要创建一个具体的消息,在JMS中定义了一个最基本的接口→Message,但是一个Message是一个比较抽象的概念在实际生产环境中我们可能发送各种类型的消息比如说:普通文本、Java对象等等。在JMS中大概把这些消息分为以下类型:TextMessage、MapMessage、ObjectMessageStreamMessage、BytesMessage 这些接口都继承了Message接口,当然除此之外ActiveMQ还为我们扩充了一个消息类型BlobMessage,强调以下这个到目前为止还不是JMS规范的东西,只是ActiveMQ扩充了一个消息类型 在这里 我们先创建一个普通的TextMessage

TextMessage message= session.createTextMessage("Hello JMS!");

第七步:消息的目的地有了、要发送的消息有了,但是这个消息要谁去发送呢,所以必须有一个消息的发送方→生产者(消息)。生产者的创建也是有session创建的我们可以直接调用session.createProducer()方法去创建一个生产者当然这里需要一个参数 就是前面我们创建的destination对象。

MessageProducer producer= session.createProducer(destination);

第七步: connection有了、session存在了、消息的目的地和生产者及消息内容也存在了我们就可以立马发送消息了 消息的发送时通过 producer(MessageProducer).send(Mesaage message)方法完成的。

producer.send(message);

第八步: 消息发送完了之后我们可以选择性的关闭应该关闭的连接,因为此处是一个简单的例子所以我们把所有的资源都关闭

producer.close();
session.close();
connection.close();

完整代码如下:

package cn.sstvc.jms.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class SimpleSenderDemo {

	public   void  send() throws JMSException{
//		ConnectionFactory cf=new ActiveMQConnectionFactory(userName, password, brokerURL);
		ConnectionFactory cf=new ActiveMQConnectionFactory();
		Connection connection=cf.createConnection();
		connection.start();
		
		Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
		Destination destination= session.createQueue("test");
		TextMessage message= session.createTextMessage("Hello JMS!");
		MessageProducer producer= session.createProducer(destination);
	
		producer.send(message);
		
		producer.close();
		session.close();
		connection.close();
	}
}


© 著作权归作者所有

粉丝 0
博文 1
码字总数 1565
作品 0
海淀
私信 提问
[ActiveMQ]初识ActiveMQ

初识ActiveMQ ActiveMQ介绍 官方网站:http://activemq.apache.org/ 最新版本:ActiveMQ 5.14.1(2016-10-28) 最新版本下载链接:http://activemq.apache.org/download.html 历史版本下载链接...

candy-yun
2016/10/29
0
0
ActiveMQ 嵌入Tomcat

在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐。所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ。由此我们需要掌握三个个重要的知识点 ActiveMQ...

_herbert
2018/08/03
0
0
Spring Cloud Stream Binder 实现

Spring Cloud Stream Binder 实现 JMS 实现 ActiveMQ 1.增加Maven依赖

xiaoshuaiv5
04/01
0
0
请教一个使用activeMQ的问题

我想利用activeMQ来处理日志信息 目前的情况是jboss (spring3)发送消息至 activeMQ服务器 这样我该怎么来处理发送的消息 是要重新部署一个web程序在jboss上接收activeMQ的消息? 还是在activ...

景愿
2011/06/15
554
3
ActiveMQ初探(1)——介绍与基本使用

一、ActiveMQ 1.1 什么是ActiveMQ 是Apache出品,最流行的,能力强劲的。ActiveMQ是一个完全支持和规范的 实现,尽管规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊...

yuanlaijike
2018/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

tomcat 莫名奔溃问题

Apr 24, 2019 6:18:11 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8080"] Apr 24, 2019 6:18:12 PM org.apache.coyote.AbstractProtocol pause......

mellen
21分钟前
0
0
组件开发规范 class名身份识别

组件需要通过一个组件共有的class来标识这个组件,外部调用的时候,可以通过锁定这个class来方便地改变组件的css样式。 设置方式 .my-checkbox { width: 20px; height: 20px; font-...

Carbenson
29分钟前
1
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
49分钟前
2
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
50分钟前
1
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部