ActiveMQ P2P版的HelloWorld
1.2 JMS应用程序接口
ConnectionFactory:
用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。 管理员
在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。
Connection:
连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允
许用户创建会话,以发送和接收队列和主题到目标。
Session:
表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会
话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以
使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。
Destination:
目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然
后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。
MessageConsumer:
由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。
MessageProducer:
由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。
Message:
是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:
消息头(必须):包含用于识别和为消息寻找路由的操作设置。
一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。
消息接口非常灵活,并提供了许多方式来定制消息的内容。
2.Hello World
2.0 基本配置
使用Maven,pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion> <groupId>org.ygy</groupId>
<artifactId>activemq</artifactId>
<version>0.0.-SNAPSHOT</version>
<packaging>jar</packaging> <name>activemq</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency> <!-- activemq,学习中 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.</version>
</dependency> </dependencies>
</project>
这里只要引入ActiveMQ的依赖就可以了。
2.1 P2P版的HelloWorld
生产者:HelloQueueProducer
package org.ygy.mq.lesson01; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
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; /**
* 最简单的生产者
*
* @author yuguiyang
*
*/
public class HelloQueueProducer {
public static void main(String[] args) {
// 生产者的主要流程
Connection connection = null; try {
// 1.初始化connection工厂,使用默认的URL
//failover://tcp://localhost:61616
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); // 2.创建Connection
connection = connectionFactory.createConnection(); // 3.打开连接
connection.start(); // 4.创建Session,(是否支持事务)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 5.创建消息目标
Destination destination = session.createQueue("queue_lesson"); //6.创建生产者
MessageProducer producer = session.createProducer(destination); //7.配置消息是否持久化
/* DeliverMode有2种方式:
*
public interface DeliveryMode {
static final int NON_PERSISTENT = 1;//不持久化:服务器重启之后,消息销毁 static final int PERSISTENT = 2;//持久化:服务器重启之后,该消息仍存在
}
*/
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //8.初始化要发送的消息
TextMessage message = session.createTextMessage("Hello World ! from yuguiyang"); //9.发送消息
producer.send(message); } catch (JMSException e) {
e.printStackTrace();
} finally{
try {
//10.关闭连接
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
消费者:HelloQueueConsumer
package org.ygy.mq.lesson01; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 简单的消费者
*
* @author yuguiyang
*
*/
public class HelloQueueConsumer implements MessageListener { @Override
public void onMessage(Message message) {
//如果消息是TextMessage
if (message instanceof TextMessage) {
//强制转换一下
TextMessage txtMsg = (TextMessage) message;
try {
//输出接收到的消息
System.out.println("HaHa: I'v got " + txtMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
} public void receive() {
// 消费者的主要流程
Connection connection = null; try {
// 1.初始化connection工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); // 2.创建Connection
connection = connectionFactory.createConnection(); // 3.打开连接
connection.start(); // 4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 5.创建消息目标
Destination destination = session.createQueue("queue_lesson"); //6.创建消费者
MessageConsumer consumer = session.createConsumer(destination); //7.配置监听
consumer.setMessageListener(this);
} catch (JMSException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
new HelloQueueConsumer().receive();
} }
3.测试
代码写好了,我们测试一下
3.1 启动ActiveMQ服务器
上一篇博客中,说过,进入到bin目录下,双击 activemq.bat,启动
启动后,访问 http://localhost:8161/admin/
可能会让你输入用户名和密码 ,这里默认的用户名:admin;密码:admin
然后,我们单击那个 Queues菜单:
这里默认应该什么都没有,有的话,也没事
3.2运行程序
我们先运行生产者,运行完之后,刷新一下,上面的界面:
可以看到上面的记录
这里显示的是服务器上的队列,
Name:就是队列的名字啦,其中 queue_lesson就是我们程序中新建队列
Number Of Pending Messages:是等待消费的消息,因为我们只运行了生产者,而且只产生了一条消息,因此队列中有一条未消费的消息。
Number Of Consumers:当前运行着的消费者,我们还没有
Messages Enqueued :进入队列的消息,我们只产生了一次,也只有一条消息
Message Dequeued:出了队列的消息,指被消费的消息
Views:查看当前队列的一些信息
Operations:对当前队列的一些操作
在这里,我们单击Browse连接:
在这里,我们能看到当前队列中的消息
Message ID:应该是自动生成的,还不了解
Correlation ID:这个以后再研究,他主要是用来关联多个Message,例如需要回复一个消息时,通常把回复的消息的JMSCorrelationID设置为原来消息的ID
Persistence:是否持久化,我们在代码里,没有设置持久化
Priority:权重,默认应该为4
Redelivered:消息是否被重发
Reply To:回复,以后会说到
TimeStamp:消息的时间戳
Type:消息类型
Operations:操作
下面,我们点击Message ID 连接,进入到消息的详细界面:
这里,可以看到,消息的内容和消息头信息
好了,到这里,我们就可以运行消费者了,先回到最开始的界面:
运行消费者,之后,控制台输出:
我们接受到了消息。
刷新界面:
可以看到,这里的内容变了,
因为消息被我们消费了,所以被消费消息加1,而且,当前消费者还在运行,所以有一个消费者。
ActiveMQ P2P版的HelloWorld的更多相关文章
- ActiveMQ Pub/Sub版的HelloWorld
1. pom.xml 这个和上一篇是一样的: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...
- Mina入门:mina版之HelloWorld
一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式切入Mina入门学习了. 二,搭建项目结构与解决项目依赖 ...
- Mina入门:mina版之HelloWorld[z]
Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...
- activemq p2p方式
package ch02.chat; import java.io.Serializable; import javax.jms.Connection; import javax.jms.Connec ...
- ActiveMQ P2P模型 观察者消费
生餐者: package clc.active.listener; import org.apache.activemq.ActiveMQConnectionFactory; import org.t ...
- 初学tornado之MVC版helloworld
作者:the5fire | 标签: MVC tornado | 发布:2012-08-06 2:41 p.m. 文接上篇,看我一个简单的helloworld,虽然觉得这个框架着实精小,但是实际开发 ...
- FreeMarker使用小记(HelloWorld)
FreeMarker是开源的模板框架.对于它的介绍网上已经很多了.详情可参考主页:http://www.freemarker.org/ 现在我们就开始我们的FreeMarker版的Hello Worl ...
- 第十一章 企业项目开发--消息队列activemq
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
- Scala入门:从HelloWorld开始【源码及编译】
最近在学习Scala语言,虽然还没有完全学通, 但是隐约可以体会到Scala的简洁和强大. 它既能让程序员使用函数式编程, 也提供了全面的面向对象编程. 在刚刚开始读<Scala编程>的时 ...
随机推荐
- ORACLE中的FTP例子代码
http://blog.csdn.net/mashengwang/article/details/5982663 CREATE OR REPLACE DIRECTORY my_docs AS '/u0 ...
- eclipse 离线安装插件报cannot perform operation.Computing alternate solutions...解决办法
当不能连接外网,离线安装SVN插件时,可能会发现以下问题:eclipse长时间停留在下图所示状态,提示“cannot perform operation.Computing alternate sol ...
- SQL Server 字符串拼接、读取
一.查询结果使用,字符串拼接 declare @names nvarchar(1000) declare @ParmDefinition nvarchar(1000) declare @sqltext ...
- 在推送提交之后阻止Azure DevOps (TFS)持续集成
在Azure DevOps服务器上配置生成定义时,可以配置连续集成(CI)生成.每次签入或提交到源代码库时都会自动运行一个CI构建.这种机制允许开发人员启动一个自动化的过程,例如编译和部署构建.这是一 ...
- EF Core创建实体的Code First标准方法
针对关系型数据库,实体之间的关系最常见的就是通过外键关联的一对一.一对多和多对多的关系,新的EF Core通过注释和Fluent API 能够做到接近于数据库通过DML创建模型的效果了.实际上,通过D ...
- C++数组初始化方法
定义: ]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指 ...
- Python 私有变量中两个下划线 _ _item 与 一个下划线的区别 _item
python中没有常量的说法, 但是可以通过元组实现一个常量 在python的私有变量中, 存在两个下划线 _ _item 与一个下划线 _item 的区别 前面带两个下划线的私有变量: 只能在本类中 ...
- collections, time, queue的应用
collections (克来克深思) Counter from collections import Counter # 引入模块, 计数器 Counter(康特) s = 'sadfasdfas ...
- 二进制入门-打造Linux shellcode基础篇
0x01 前言 本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责. ...
- [LeetCode]最长回文子串 java
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...