本文主要介绍activeMQ在应用程序中是如何使用的,同个两个实例进行说明,这两个实例分别针对P2P模式和Pub/Sub模式。

开发环境

  • 操作系统:Ubuntu 16.10
  • 开发平台:Eclipse Neon Release (4.6.0)
  • ActiveMQ版本:apache-activemq-5.14.3

  具体的环境下载与配置这里就不在详细描述啦

项目建立与实现

  先为大家展示以下项目最后的结构图:

操作步骤

  1. 在Eclipse中新建一个最基本的Java Project,本项目命名为“activeMQHelloWorld”
  2. 在项目根目录下建立文件夹libs,并将activemq-all-5.14.3.jar依赖包复制到文件夹中
  3. 通过 JavaBuildPath 中的libraries将依赖包引入项目中

  到目前位置项目框架搭建完毕(简单容易吧)

  分别实现P2P消息模型和Pub/Sub消息模型,首先实现P2P消息模型:

  P2P消息模型

    编写生产者代码QueueProducer.java如下:

 package com.unionpay.activemq;

 import javax.jms.Connection;
import javax.jms.ConnectionFactory;
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 QueueProducer { //默认连接用户
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默认连接密码
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默认连接地址
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; private static final int SENDNUM = 10; public static void main(String[] args){
//连接工厂
ConnectionFactory connectionFactory;
//连接
Connection connection = null;
//会话,接受或者发送消息的线程
Session session;
//消息的目的地
Destination destination;
//消息生产者
MessageProducer messageProducer; //实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL); try{
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session,第一个参数true表示支持事物,false表示不支持事物,Session.AUTO_ACKKNOWLEDGE
//表示自动确认,客户端发送和接受消息不需要做额外的工作
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建一个名为HelloWorld的消息队列
destination = session.createQueue("QueueTest");
//创建消息生产者
messageProducer = session.createProducer(destination);
//发送消息
sendMessage(session,messageProducer);
//提交消息
session.commit();
session.close();
}catch(Exception e){
e.printStackTrace();
}finally{
if(connection != null){
try{
connection.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
} /**
* 发送消息
* @param session
* @param messageProducer
* @throws Exception
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws Exception{
for(int i=0;i<SENDNUM;i++){
//创建一条文笔消息
TextMessage message = session.createTextMessage("ActiveMQ 发送消息"+ i);
System.out.println("发送消息:Activemq发送消息" + i); messageProducer.send(message);
}
}
}

  编写消费者代码QueueConsumer.java代码如下:

 package com.unionpay.activemq;

 import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; /**
* @author jxwch
*
*/
public class QueueConsummer { private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; public static void main(String[] args) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
try {
Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("QueueTest"); MessageConsumer messageConsumer = session.createConsumer(destination); while (true) {
//100000代表100000毫秒
TextMessage message = (TextMessage) messageConsumer.receive(100000);
if (message != null) {
System.out.println("收到消息:" + message.getText());
} else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
}
} }

  到此,P2P模型代码已经全部编写完成,可以测试喽:

  当然,我们要测试activeMQ,那么首先一定要启动服务器:

 cd apache-activemq-5.14.3/bin
bash activemq start

  通过访问自带监控应用查看服务器是否启动正常:http://127.0.0.1:8161/admin/

  若服务器运行正常,首先在Eclipse中运行QueueProducer.java,终端打印出如下信息:

  此时查看监控程序页面,点击“Queue”出现如下信息:

  从截图中我们可以看到,在Queue消息中,有一个Name为QueueTest的消息队列,其中“Number Of Pending Message”表示队列中存在10条消息,“Message Enqueued” 表示有10条消息正在排队。通过点击Views中的Browser可以查看队列中的消息:

  并且可以通过Delete对这些消息进行删除操作。

  下面我们继续运行QueueConsumer.java,终端打印如下信息:

  Pub/Sub 模型

  首先编写Publisher端文件TopicProducer.java:

 package com.unionpay.activemq;

 import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; public class TopicProducer { private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int SENDNUM = 10; public static void main(String[] args) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
Connection connection = null;
Session session = null;
Topic topic = null;
MessageProducer messageProducer = null;
try {
connection = connectionFactory.createConnection(); connection.start(); session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); topic = session.createTopic("NEWS"); messageProducer = session.createProducer(topic); messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); for (int i = 0; i < SENDNUM; i++) {
MapMessage mapMessage = session.createMapMessage(); mapMessage.setLong("count", i); messageProducer.send(mapMessage); System.out.println("发布者发布消息:" + i); session.commit();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
} if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}

  然后编辑Subscriber端文件TopicConsumer.java:

package com.unionpay.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; public class TopicConsumer { private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; public static void main(String[] args){
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL); Connection connection = null;
try {
connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("NEWS"); MessageConsumer messageConsumer = session.createConsumer(topic); while(true){ MessageListener messageListener = new MessageListener(){ @Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
MapMessage mapMessage = null;
try{
mapMessage = (MapMessage)message; System.out.println("Receiver Message:" + mapMessage.getLong("count"));
}catch(JMSException e){
e.printStackTrace();
}
}
};
messageConsumer.setMessageListener(messageListener);
} } catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(connection != null){
try{
connection.close();
}catch(JMSException e){
e.printStackTrace();
}
}
}
} }

  到此,Pub/Sub模型代码编写完毕,下面运行TopicProducer.java文件,终端打印出如下信息:

  然后查看监控程序,点击“Topics”:

  从截图中我们可以看出Name中多了一个NEWS主题,并且Messages Enqueued为10。

  然后运行客户端TopicConsumer.java文件,终端显示如下:

  从截图中我们并没有发现客户端消费了消息,这是为啥呢?

  因为在Pub/Sub模型中,发布者和订阅者有时间上的依赖性,针对某个主题,必须先创建订阅者,然后才能发布消息,这样才能保证订阅者可以收到消息。

  重新运行TopicConsumer.java文件,就可以看见消费信息了:

  至此,两种模式已经全部介绍完毕。

  源码:activeMQHelloWorld.zip

参考文献

  1. ubuntu下简单使用activemq

activeMQ "HelloWorld"实现的更多相关文章

  1. ActiveMQ HelloWorld入门

    在P2P的消息模型中,双方通过队列交流,一个队列只有一个生产者和一个消费者.a.消息生产者 package com.ljq.durian.test.activemq; import javax.jms ...

  2. ActiveMQ(2) ActiveMQ创建HelloWorld

    启动ActiveMQ: 请参见:ActiveMQ(1) 初识ActiveMQ 创建Maven工程: pom文件: <project xmlns="http://maven.apache ...

  3. ActiveMQ安装及使用

    1 安装环境 1.需要jdk2.安装Linux系统.生产环境都是Linux系统. 2 安装步骤 第一步: 把ActiveMQ 的压缩包上传到Linux系统.第二步:解压缩. 第三步:关闭防火墙 临时关 ...

  4. ActiveMQ(3) ActiveMQ创建(simpleAuthenticationPlugin)安全认证

    控制端安全认证: ActiveMQ目录conf下jetty.xml: <bean id="securityLoginService" class="org.ecli ...

  5. 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  6. JMS【三】--ActiveMQ简单的HelloWorld实例

    第一篇博文JMS[一]--JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文JMS[二 ...

  7. ActiveMQ简单的HelloWorld实例

    我们使用ActiveMQ为大家实现一种点对点的消息模型. 开发时候,要将apache-activemq-5.12.0-bin.zip解压缩后里面的activemq-all-5.12.0.jar包加入到 ...

  8. ActiveMQ 入门helloworld

    1.下载安装ActiveMQ 官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Unix 等几个版本 ...

  9. 【转】深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

    这篇博文,我们使用ActiveMQ为大家实现一种点对点的消息模型.如果你对点对点模型的认识较浅,可以看一下第一篇博文的介绍. JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下 ...

随机推荐

  1. Linux日知录(常用问题笔记)

    http://blog.csdn.net/yizhu2000/article/details/70688420)序言 日有一知,当有一录,自09年来,工作所需,接触开源平台,对Linux常有涉猎,其间 ...

  2. pandas知识点汇总

    ## pandas基础知识汇总 1.时间序列 import pandas as pd import numpy as np import matplotlib.pyplot as plt from d ...

  3. django源码分析---- Model类型&Field类型

    djiango在数据库这方式自己实现了orm(object relationship mapping 对象关系模型映射).这个主要是用到python 元类这一 项python中的高级技术来实现的. c ...

  4. MYSQL备份与恢复精华篇

    数据备份原理 数据备份属于数据容灾保护中的内容,所有的数据备份系统设计都基于这五个元素,备份源.备份目标.传输网络.备份引擎和备份策略.用户按照需要制定备份策略,使用定时任务执行备份脚本,使用备份引擎 ...

  5. 在CentOS7系统上执行Scala脚本

    在类Unix系统上,可以在scala文件中开头第一行指定脚本的解释程序.如下例: Script.scala #!/usr/bin/env scala println("Hello" ...

  6. atitit.http get post的原理以及框架实现java php

    atitit.http get post的原理以及框架实现java php 1. 相关的设置 1 1.1. urlencode 1 1.2. 输出流的编码 1 1.3. 图片,文件的post 1 2. ...

  7. python操作sqlserver

    # coding=gbk import sys   import pymssql #尝试数据库连接 try:     conn = pymssql.connect(host="192.168 ...

  8. dmesg命令应用

    昨晚上线服务的时候,看log偶然发现服务在启动半小时左右就会被supervise重新拉起,也没有core.通过重新启动的服务发现内存飙涨,且持续增加,怀疑是内存打满,进程被kill了. 其实怀疑是正确 ...

  9. MapReduce编程实例3

    MapReduce编程实例: MapReduce编程实例(一),详细介绍在集成环境中运行第一个MapReduce程序 WordCount及代码分析 MapReduce编程实例(二),计算学生平均成绩 ...

  10. python学习笔记3----正则表达式

    正则表达式(RE)是通过re模块来实现的. 字符匹配: --普通字符: *大多数字母和字符一般都会和自身匹配. --元字符:. ^ $ * + ? {}  [] \ | () []: 通常用来指定一个 ...