当前位置: 首页 > 编程日记 > 正文

ActiveMQ快速入门

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.下载ActiveMQ

去官方网站下载:http://activemq.apache.org/

2.运行ActiveMQ

解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。

启动ActiveMQ以后,登陆:http://localhost:8161/admin/,创建一个Queue,命名为FirstQueue。

3.创建Eclipse项目并运行

创建project:ActiveMQ-5.5,并导入apache-activemq-5.5.1\lib目录下需要用到的jar文件,项目结构如下图所示:

3.1.Sender.java

复制代码
package com.xuwei.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {
private static final int SEND_NUMBER = 5;

public static void main(String[] args) {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// MessageProducer:消息发送者
MessageProducer producer;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("FirstQueue");
// 得到消息生成者【发送者】
producer = session.createProducer(destination);
// 设置不持久化,此处学习,实际根据项目决定
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 构造消息,此处写死,项目就是参数,或者方法获取
sendMessage(session, producer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}

public static void sendMessage(Session session, MessageProducer producer)
throws Exception {
for (int i = 1; i <= SEND_NUMBER; i++) {
TextMessage message = session
.createTextMessage("ActiveMq 发送的消息" + i);
// 发送消息到目的地方
System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
producer.send(message);
}
}
}
复制代码

3.2.Receiver.java

复制代码
package com.xuwei.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver {
public static void main(String[] args) {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// 消费者,消息接收者
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("FirstQueue");
consumer = session.createConsumer(destination);
while (true) {
//设置接收者接收消息的时间,为了便于测试,这里谁定为100s
TextMessage message = (TextMessage) consumer.receive(100000);
if (null != message) {
System.out.println("收到消息" + message.getText());
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
复制代码

4.注意事项

  1. 最后接收者跟发送者在不同的机器上测试
  2. 项目所引用的jar最后在ActiveMQ下的lib中找,这样不会出现版本冲突。

5.测试过程

因为是在单机上测试,所以需要开启两个eclipse,每一个eclipse都有自身的workspace。我们在eclipse1中运行Receiver,在eclipse2中运行Sender。

刚开始eclipse1中运行Receiver以后console介面没有任何信息,在eclipse2中运行Sender以后,eclipse2中的console显示如下信息:

发送消息:ActiveMq 发送的消息1
发送消息:ActiveMq 发送的消息2
发送消息:ActiveMq 发送的消息3
发送消息:ActiveMq 发送的消息4
发送消息:ActiveMq 发送的消息5

而回到eclipse1中发现console界面出现如下信息:

收到消息ActiveMq 发送的消息1
收到消息ActiveMq 发送的消息2
收到消息ActiveMq 发送的消息3
收到消息ActiveMq 发送的消息4
收到消息ActiveMq 发送的消息5

PS:2012-2-27

今天发现测试并不需要开启两个eclipse,在一个eclipse下页可以启动多个程序,并且有多个console,在上面的Receiver.java中,设置一个较大的时间,比如receive(500000),如下代码所示:

TextMessage message = (TextMessage) consumer.receive(500000);

这个时候运行Receiver.java的话,会使得这个Receiver.java一直运行500秒,在eclipse中可以发现:

点击那个红色方块可以手动停止运行程序。

运行玩receiver以后我们在运行sender,在运行完sender以后,我们要切换到receiver的console,如下图所示:

转载于:https://my.oschina.net/zhanghaiyang/blog/594842

相关文章:

企业为什么要使用基于Docker的PaaS/CaaS平台

作者&#xff1a;精灵云 前言早在十多年前国内外的一些大厂就开始投入研发和使用容器技术&#xff0c;比如Google&#xff0c;对他们来说&#xff0c;使用容器能够充分利用计算资源节省硬件成本。而这几年——众所周知——真正把容器技术发扬光大的是Docker。Docker的slogan“B…

算法基础知识科普:8大搜索算法之红黑树(下)

这是介绍红黑树的最后一部分&#xff0c;令y为要删除结点&#xff0c;n为要删除结点的子结点&#xff08;子结点最多有1个&#xff09;&#xff0c;w为y的兄弟结点&#xff0c;删除操作的重点是使红黑树删除结点并通过调整后仍满足自身是搜索二叉树和设定的三点规则。删除操作可…

asp提供在线文章翻译的功能(转)

有时候想为我们的网页提供多语言支持&#xff0c;如果一种语言用一张网页来做实在太麻烦了&#xff0c;幸好Google提供了语言工具功能&#xff0c;下面介绍如何利用它来实现网页多种语言之间的转换。 作者&#xff1a;淘特网 出处&#xff1a;http://www.tot.name 注&#xff1…

Java基础学习总结(13)——流IO

2019独角兽企业重金招聘Python工程师标准>>> 一、JAVA流式输入/输出原理 流是用来读写数据的&#xff0c;java有一个类叫File&#xff0c;它封装的是文件的文件名&#xff0c;只是内存里面的一个对象&#xff0c;真正的文件是在硬盘上的一块空间&#xff0c;在这个文…

ASP.NET 2.0 绑定高级技巧

1.简单数据绑定定<!--ASP.NET 1.x data binding expression --><%# DataBinder.Eval(Container.DataItem, "Price") %><!--Equivalent ASP.NET 2.0 data binding expression --><%# Eval("Price") %><!--XML data binding --&g…

JSP中的EL表达式详细介绍

2019独角兽企业重金招聘Python工程师标准>>> 一、JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0…

Software development Problem

筹划“软件开发过程”以及“面向对象分析与设计”这个话题已有很长时间。虽然大学毕业后在Rational公司学习过这方面的内容&#xff0c;这几年带着团队也一直践行里面的理念与方法&#xff0c;但总感觉自己理解的不透彻&#xff0c;不敢动笔。 10年过去了&#xff0c;总不能一…

Spring MVC常用注解说明

2019独角兽企业重金招聘Python工程师标准>>> 使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能。02 之前在使用Struts2实现MVC的注解时&#xff0c;是借助struts2-convention这个插件&#xff0c;如今我们使用Spring自带的spring-webmvc组件来实现同…

代码规范性与品质问题~

&#xff12;&#xff10;&#xff10;&#xff11;年在delphibbs做“首届Delphi编程竞赛”活动(http://www.delphibbs.com/delphibbs/dispq.asp?lid650664)的时候&#xff0c;曾就代码的规范性与品质问题与大家进行过讨论&#xff0c;摘录一些言论如下&#xff1a;3. 我们公司…

FutureTask中Treiber堆的实现

2019独角兽企业重金招聘Python工程师标准>>> 在文章FutureTask源码分析中简单说明了FutureTask中使用Treiber堆栈来保存等待结果的线程&#xff0c;本文将详细分析其原理。 Treiber堆使用CAS操作来实现节点的入栈和出栈&#xff0c;由于CAS操作只是保证操作的原子性…

软件开发过程中遇到的问题

今天早晨去石家庄河北电力工程监理有限公司&#xff0c;回来后就在整理这篇图文&#xff0c;结果还是过了12:00。这是针对昨天图文“Software Development Problem”的翻译以及自己的一些理解&#xff0c;分享给大家。 其实&#xff0c;看看这些东西蛮好的&#xff0c;最起码能…

Java基础学习总结(9)——this关键字

2019独角兽企业重金招聘Python工程师标准>>> 一、this关键字 this是一个引用&#xff0c;它指向自身的这个对象。 看内存分析图&#xff1a; 假设我们在堆内存new了一个对象&#xff0c;在这个对象里面你想象着他有一个引用this&#xff0c;this指向这个对象自己&am…

转贴:雅虎公司C#笔试题,看看你能解答多少

这是刚在在网上看到了&#xff0c;觉得这些题目出得真不错&#xff0c;能考出一个程序员的基本功。所以先发在这里&#xff0c;做个备份&#xff0c;以后慢慢来做&#xff08;偶好像只能免强及格哦&#xff0c;呵呵&#xff0c;关于网络的题目太多了&#xff0c;偶不太熟啊&…

亿级PV请求的三种负载均衡技术

在互联网不断渗透到生活中的今天&#xff0c;各种各样的网络服务存在在我们身边&#xff0c;他们的访问流量也是大得惊人。一个大型网站&#xff08;百万PV以上&#xff09;想要正常访问&#xff0c;单单靠一台服务器是不可能提供稳定服务的。这时候就需要用负载均衡技术将海量…

The Six Best Practices(1~3)

前几期的图文我们介绍了软件工程中常见的问题&#xff0c;分析了产生这些问题的根本原因&#xff0c;引出了软件工程中的六个最佳经验。今天我们具体介绍这些最佳经验的内容。

Java项目命名规范

2019独角兽企业重金招聘Python工程师标准>>> 一、命名规范 1、 项目名全部小写 2、 包名全部小写 3、 类名首字母大写&#xff0c;如果类名由多个单词组成&#xff0c;每个单词的首字母都要大写。 如&#xff1a;public class MyFirstClass{} 4、 变量名、方法名首字…

一道数据结构算法题

现有一个链表&#xff0c;证明如果存在环&#xff0c;则&#xff1a;使用两个指针同时前进但步长不一样&#xff0c;则能够在有限步之后能够相逢。题目的意思是我归纳出来的&#xff0c;我的解题思路是这样的&#xff1a;能够相下逢的意思是&#xff1a;在走了x步以后&#xff…

win7系统下载 ghost win7 Sp1 32位纯净3月版

win7系统下载 ghost win7 Sp1 32位纯净3月版软件名称: Ghost Win7 Sp1 32位纯净3月版软件语言: 简体中文软件大小: 3.81大小: GB发布日期: 2017-03-21文件名称: ZJY_Ghost_win 7_X86_CJ201703.GHOM D 5: C21A7A17D8C2568A05844C5…

The Six Best Practices(4~6)

昨天图文介绍了The Six Best Practices的前三个经验&#xff1a;迭代化开发、需求管理、基于构件的体系构架&#xff0c;今天介绍后面的三个经验&#xff1a;可视化建模、持续的质量验证和变更管理。

代码生成器前戏 之 数据库元数据

总结&#xff1a;代码生成器大致有两种方式&#xff0c;1.根据po 生成 表 结构 等系列类&#xff0c;如 Hibernate自动生成 2.根据表生成 po 等系列类。其实实际 开发时候 多半还是 先设计好表&#xff0c;然后生成 的情况多。 元数据&#xff1a;描述数据的数据&#xff0c;就…

有感于框架设计难,实施框架更难!

很久没有写了&#xff0c;不能怪没有时间&#xff0c;只是自己太懒。这两天休息&#xff0c;有时间重新回顾一下项目的设计&#xff0c;从目前的开发情况看&#xff0c;最早设计的一些编程框架&#xff0c;并没有很好的遵守&#xff0c;看上去比较零乱&#xff0c;这个可能由于…

六个最佳的软件工程实践(基于构件的体系结构、可视化建模)

昨天图文介绍了迭代化开发和需求管理&#xff0c;今天我们介绍基于构件的体系结构和可视化建模。基于构件的体系结构是软件开发中最体现创造力的地方&#xff0c;可以通过“修建桥梁”来理解为什么要贯彻基于构件的体系结构以指导我们每次开发的演进增量过程。可视化建模是为了…

通讯组基本管理任务一

经常收发邮件的人都有同感&#xff1a;很多时候都需要向一组人发送邮件。如果一封封地发送&#xff0c;不仅耽误时间&#xff0c;而且很容易出错&#xff0c;将邮件发送给不应该接受邮件的收件人。Exchange Server 2010为了方便用户使用&#xff0c;通过“通讯组”和“地址列表…

无人驾驶相关数据集

普林斯顿大学人工智能自动驾驶汽车项目&#xff1a; 代码V1&#xff1a;http://deepdriving.cs.princeton.edu/DeepDrivingCode_v1.zip 代码V2&#xff1a; http://deepdriving.cs.princeton.edu/DeepDrivingCode_v2.zip 训练集&#xff08;50G&#xff09;&#xff1a;http://…

六个最佳的软件工程实践(持续的质量验证、变更管理)

昨天图文介绍了基于构件的体系结构以及可视化建模&#xff0c;今天我们介绍六个最佳工程实践的最后两个&#xff0c;持续的质量验证以及变更管理。持续的质量验证是伴随迭代化开发而进行的不断验证&#xff0c;且每次迭代的测试集合都是不断递增的。质量验证不仅从功能方面要满…

css层叠样式表(一)

今天研究了下css。这东东入门不算难。可是想写出好的样式就得有很深的功底了。按照老大给网址&#xff0c;12天学会网页设计。做下总结吧。css通过div&#xff08;层&#xff09;来定位&#xff0c;通过层的margin,padding,border等属性来控制板块的间距。常用的模型是盒状模型…

aspx页面使用ajax遇到try catch中使用Response.End()报错

1、使用Ajax接收数据&#xff0c;在返回Response.Write()后应该调用Response.End()才能将数据写入到调用的页面,才能被jQuery的回调函数获取到返回的JSON数据 2、在try--catch里面不能用Response.End()&#xff0c;否则会报错&#xff1a;由于代码已经过优化或者本机框架位于调…

GO是更好的编程语言吗?

引言 团队有项目考虑用GO重写&#xff0c;所以花了些时间调研GO。 第一次接触GO是2年前&#xff0c;17年3月份&#xff0c;全职钻研一周&#xff0c;彼时C中毒太深&#xff0c;内心排斥其他编程语言&#xff0c;看其他语法总觉得有点怪&#xff0c;而且有“C/C能做任何事&#…

定位DIV滚动条

如果由于table中有一个下拉框&#xff0c;还有一个treeview时&#xff0c;treeview的所有节点都是取于下拉框的下拉选项来的&#xff0c;所以在第一定位这之后&#xff0c;当选择其他下拉框中其他的选项时&#xff0c;DIV的scrollTop值是会一直保存前一个步聚DIV滚动条所在的位…

JS作用域相关知识(#精)

在学习《你不知道的JS》一书中&#xff0c;特将作用域相关知识在此分享一下: #说到作用域&#xff0c;就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值&#xff0c;则使用LHS查询 2)如果查询目的是获取变量的值&#xff0c;则使用RHS查询 作用域的查询都会从当前…