c+调用java编写mq_0032ActiveMQ之java编码实现生产者和消费者操作队列queue

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

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

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

org.apache.activemq

activemq-all

5.15.9

org.apache.xbean

xbean-spring

3.16

2、  JMS编码总体架构

d3abd8bb61fef274244766a58732aa44.png

3、生产者编码如下:

importorg.apache.activemq.ActiveMQConnectionFactory;

importjavax.jms.*;

public classJmsProduce {

public static  finalString ACTIVEMQ_URL= "tcp://192.168.225.132:61616";

public static voidmain(String[] args) throwsJMSException {

//1按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)ActiveMQConnectionFactory activeMQConnectionFactory = newActiveMQConnectionFactory(ACTIVEMQ_URL);

//2通过连接工厂获得连接Connection connection = activeMQConnectionFactory.createConnection();

//3启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问connection.start();

//4创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

//5创建目的地(具体是队列queue还是主题topic),参数是队列的名称//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承DestinationQueue queue = session.createQueue("queue1");

//6创建消息的生产者,负责向指定队列中生产消息MessageProducer producer = session.createProducer(queue);

//7创建3条消息,并由生产者发送到目的地for(inti=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、控制台查看队列中是否有消息存在,如下图:

3b63425b9334b1125c91dc434ed7876c.png

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

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

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

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

importorg.apache.activemq.ActiveMQConnectionFactory;

importjavax.jms.*;

public classJmsConsumer {

public static  finalString ACTIVEMQ_URL= "tcp://192.168.225.132:61616";

public static voidmain(String[] args) throwsJMSException {

//1按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)ActiveMQConnectionFactory activeMQConnectionFactory = newActiveMQConnectionFactory(ACTIVEMQ_URL);

//2通过连接工厂获得连接Connection connection = activeMQConnectionFactory.createConnection();

//3启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问connection.start();

//4创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

//5创建目的地(具体是队列queue还是主题topic),参数是队列的名称//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承DestinationQueue 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消费消息完成!");

}

}

cca60318f1b6b01f800875f427233ff6.png

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

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

23b7575c81c573008d2f368e054036c2.png

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

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

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

cb2e3d31a0b4ff213ed3b365dcfa6e4a.png

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

845556106c664b61c518e79a74d75d94.png

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

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

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

importorg.apache.activemq.ActiveMQConnectionFactory;

importjavax.jms.*;

importjava.io.IOException;

public classJmsConsumer {

public static  finalString ACTIVEMQ_URL= "tcp://192.168.225.132:61616";

public static voidmain(String[] args) throwsJMSException, IOException {

//1按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)ActiveMQConnectionFactory activeMQConnectionFactory = newActiveMQConnectionFactory(ACTIVEMQ_URL);

//2通过连接工厂获得连接Connection connection = activeMQConnectionFactory.createConnection();

//3启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问connection.start();

//4创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

//5创建目的地(具体是队列queue还是主题topic),参数是队列的名称//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承DestinationQueue 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(newMessageListener() {

@Override

public voidonMessage(Message message) {

if(message != null&& message instanceofTextMessage){

TextMessage textMessage = (TextMessage)message;

try{

System.out.println(textMessage.getText());

} catch(JMSException e) {

e.printStackTrace();

}

}

}

});

//7如果以监听器的形式监听消息,则需要此行代码,代表不关闭消费者,否则有可能上边还没有进行消费,下边就把资源都关闭了//会抛出IOExceptionSystem.in.read();

//8关闭资源consumer.close();

session.close();

connection.close();

System.out.println("消费者从activemq消费消息完成!");

}

}

结果如下:

74b53025d05b1b78026173f9f4f649f1.png

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值