今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下:

maven工程的搭建此处不再讲解,在maven工程已搭建好的前提下进行如下步骤:

1、  pom.xml中引入activemq所需的两个jar包

<dependency>

<groupId>org.apache.activemq</groupId>

<artifactId>activemq-all</artifactId>

<version>5.15.9</version>

</dependency>

<dependency>

<groupId>org.apache.xbean</groupId>

<artifactId>xbean-spring</artifactId>

<version>3.16</version>

</dependency>

2、  JMS编码总体架构

3、生产者编码如下:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsProduce {
    public static 
final
String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
    public static void main(String[] args) throws JMSException {
        //1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
       
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2 通过连接工厂获得连接
       
Connection connection =
activeMQConnectionFactory.createConnection();
        //3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
       
connection.start();
        //4 创建会话sessionfalse代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
       
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5 创建目的地(具体是队列queue还是主题topic,参数是队列的名称
       
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
       
Queue queue = session.createQueue("queue1");
        //6 创建消息的生产者,负责向指定队列中生产消息
       
MessageProducer producer =
session.createProducer(queue);
        //7 创建3条消息,并由生产者发送到目的地
       
for(int i=1;i<=3;i++){
            //创建消息
           
TextMessage textMessage =
session.createTextMessage("message" + i);
            //发送消息
           
producer.send(textMessage);
        }
        //8 关闭资源
       
producer.close();
        session.close();
        connection.close();
        System.out.println("生产者向activemq生产消息完成!");
    }
}

4、控制台查看队列中是否有消息存在,如下图:

各列的含义分别是:待消费的消息数、消费者数量、消息入队数量、消息出队数量。

-----------------------------------------以上是生产者生产消息的简单过程-----------------------------

------------------------------------消费者消费消息的过程------------------------------------------------------

1、编码如下(不带等待时间):

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsConsumer {
    public static 
final
String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
    public static void main(String[] args) throws JMSException {
        //1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
       
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2 通过连接工厂获得连接
       
Connection connection =
activeMQConnectionFactory.createConnection();
        //3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
       
connection.start();
        //4 创建会话sessionfalse代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
       
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5 创建目的地(具体是队列queue还是主题topic,参数是队列的名称
       
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
       
Queue queue = session.createQueue("queue1");
        MessageConsumer consumer =
session.createConsumer(queue);
        //
       
while(true){

//receive()方法可以带一个参数,就是如果没有待消费的消息,最多等多久

//不待参数的receive()方法会一直等待,直到接收到消息,才会进行后边处理
            TextMessage message =
(TextMessage)consumer.receive();

            if(null == message){
                break;
            }
            String s = message.getText();
            System.out.println(s);
        }
        //8 关闭资源
       
consumer.close();
        session.close();
        connection.close();
        System.out.println("消费者从activemq消费消息完成!");
    }
}

发现待消费的消息为0,有一个消费者,入队的消息3条,出队的消息3条

如果不让消费者在得不到消息的情况下还一直等待,即断开消费者与queue之间的连接,或者receive(n*1000L)等待n秒后不再等待,则控制台显示的信息如下(显示的消费者会由1变为0):

2 、测试含有等待时间的receive()方法,代码更改如下:

//TextMessage message = (TextMessage)consumer.receive();
TextMessage
message = (TextMessage)consumer.receive(5000L);

生产者重新生产3条消息,控制台显示如下:

消费者换成含有等待时间的接收消息的方法,控制台显示如下:

将消费者处理完消息后,如果等待5秒还没有获得消息,则断开连接。

以上两种消费方式即:receive()方法不带参数,一直等待(生产者新生产了消息,消费者就会消费掉消息);带参数,超过等待时间就断开连接

3、 消费者以监听器的形式监听队列

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;

public class JmsConsumer {
    public static 
final
String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
    public static void main(String[] args) throws JMSException, IOException {
        //1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
       
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2 通过连接工厂获得连接
       
Connection connection = activeMQConnectionFactory.createConnection();
        //3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
       
connection.start();
        //4 创建会话sessionfalse代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
       
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5 创建目的地(具体是队列queue还是主题topic,参数是队列的名称
       
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
       
Queue queue = session.createQueue("queue1");
        MessageConsumer consumer =
session.createConsumer(queue);
        //6 消费者消费消息
      
/* while(true){
            TextMessage message =
(TextMessage)consumer.receive();
            //TextMessage message =
(TextMessage)consumer.receive(5000L);
            if(null == message){
                break;
            }
            String s = message.getText();
            System.out.println(s);
        }*/
      
//6 以监听器的形式监听并消费消息
       
consumer.setMessageListener(new MessageListener()
{
            @Override
            public void onMessage(Message
message) {
                if(message != null &&
message instanceof  TextMessage){
                    TextMessage
textMessage = (TextMessage)message;
                    try {
                        System.out.println(textMessage.getText());
                    } catch (JMSException
e) {
                       
e.printStackTrace();
                    }
                }
            }
        });
        //7 如果以监听器的形式监听消息,则需要此行代码,代表不关闭消费者,否则有可能上边还没有进行消费,下边就把资源都关闭了
       
//会抛出IOException
       
System.in.read();
        //8 关闭资源
       
consumer.close();
        session.close();
        connection.close();
        System.out.println("消费者从activemq消费消息完成!");
    }
}

结果如下:

监听器的形式也是资源不关闭,生产者生产消息,消费者就能够监听到并进行消费。监听器是异步非阻塞的方式,当消息到达后,系统自动调用监听器MessageListener的onMessage(Message message)方法。

如果启动两个消费者监听消息队列,然后生产者向queue生产消息,两个消费者会轮询消费消息,就像activemq自带负载均衡的感觉。

activemq队列小总结:无论先启动消费者,还是先启动生产者,消费者都能消费到生产者生产的消息,两个没有时间上的关系(异步),且mq中的消息一旦被消费者消费掉,就不再储存该条消息了,所以消息不会被重复消费。

若有理解不到之处,望指正!

0032ActiveMQ之java编码实现生产者和消费者操作队列queue的更多相关文章

  1. Java中的生产者、消费者问题

    Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...

  2. python条件变量之生产者与消费者操作实例分析

    python条件变量之生产者与消费者操作实例分析 本文实例讲述了python条件变量之生产者与消费者操作.分享给大家供大家参考,具体如下: 互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Pyth ...

  3. RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例

    pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...

  4. java线程中生产者与消费者的问题

    一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...

  5. java学习之生产者和消费者案例

    package com.gh.thread; /** * 生产者和消费者案例 * wait和sleep的区别 * wait不让出监视器锁,sleep让出监视器的锁 * @author ganhang ...

  6. Java中的生产者和消费者实例(多线程 等待唤醒机制)

    1.什么是等待唤醒 我们实现的效果 创建生产者和消费者  对服装进行生产  和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...

  7. Java 实践:生产者与消费者

    实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...

  8. java中的生产者和消费者的问题

    1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类, 创建ReentrantL ...

  9. java的多生产者多消费者例子

    import java.util.concurrent.locks.*; public class Test9 { public static void main(String[] args) { / ...

随机推荐

  1. 解决ViewPager与百度地图滑动冲突

    一.问题描述 ViewPager中嵌套百度地图的时候会出现百度地图滑动冲突. 二.期望结果: 滑动地图的时候只有地图滑动,滑动其他区域可以切换viewpager. 三.解决方法 自定义viewpage ...

  2. 【python小记】python操作excel文件

    题记: 最近因为工作需要,学习了python,瞬间对这个轻松快捷的语给吸引了,以前只知道js脚本是写网页的,没有想到python这个脚本语言的应用范围可以这么广泛,现在做一些简单或稍微复杂的操作,基本 ...

  3. [转帖]Linux教程(13)- Linux中的通配符和正则表达式

    Linux教程(13)- Linux中的通配符和正则表达式 2018-08-22 06:16:44 钱婷婷 阅读数 39更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文 ...

  4. Linux下zookeeper单机版详细安装

    Linux下zookeeper单机版详细安装 1.zookeeper简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop ...

  5. LeetCode | 142. 环形链表 II

    原题(Medium): 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始) ...

  6. SQL——AND、OR运算符

    一.AND.OR运算符基本说明 AND : 所有条件成立,则筛选出这条记录. OR : 只要其中一个条件成立,则筛选出这条记录. 演示student表: 二.AND运算符使用 查询name = '小明 ...

  7. asp.net Code CSRedis学习记录

    1.安装Redis for windows 安装地址 https://github.com/MicrosoftArchive/redis/releases Redis 是完全开源免费的,遵守BSD协议 ...

  8. SpringCloud--1--服务治理Eureka

    一.Eureka概述 1.Eureka特点 只需通过简单引入依赖和注解配置,就能让SpringBoot构建的微服务应用轻松地与Eureka服务治理体系进行整合. Eureka负责服务治理,即:微服务实 ...

  9. DevExtreme学习笔记(一)treeView(搜索固定、节点展开和收缩)注意事项

    var treeConfig1 = dxConfig.treeView(obj_Question.treeDataSource1); treeConfig1.selectionMode = 'sing ...

  10. 微信小程序自定义组件,提示组件

    微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加“components”目录,然后像添加Page页面一样添加自定义组 ...