java rabbitmq模拟生产者,消费者demo
1.exchange类型,rabbitmq交换机类型
exchange类型
fanout 扇形交换机,它会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列中。
direct 直连交换机,它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。
topic 主题交换机,与direct类似,但它可以通过通配符进行模糊匹配,topic模糊匹配 井号代表全部 星号代表一个字符。
headers 头交换机,不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配,headers类型的交换机性能很差,而且也不实用。
2.
EndPoint.java 定义连接,channel,队列,绑定交换机和路由键
Producer.java 生产者 发送消息,基于交换机,路由键来发送
QueueConsumer.java 消费者 基于队列来接收消息
MqTest.java MQ测试类
package com.redis.demo.rabbitmq; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; public abstract class EndPoint { protected Channel channel;
protected Connection connection;
protected String endPointName; public EndPoint(String endpointName) throws Exception {
this.endPointName = endpointName;
//Create a connection factory
ConnectionFactory factory = new ConnectionFactory(); //hostname of your rabbitmq server
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest"); //getting a connection
connection = factory.newConnection(); //creating a channel
channel = connection.createChannel(); //declaring a queue for this channel. If queue does not exist,
//it will be created on the server.
//定义队列
channel.queueDeclare(endpointName, false, false, false, null); //exchange
// channel.exchangeDeclare("fanout_test","fanout");
// //rount-key 空, 绑定队列
// channel.queueBind(endpointName,"fanout_test",""); //direct,topic
// channel.exchangeDeclare("direct_test","direct");
// channel.queueBind(endpointName,"direct_test","com.login.message");
//
channel.exchangeDeclare("topic_test","topic");
// channel.queueBind(endpointName,"topic_test","com.order.*");
channel.queueBind(endpointName,"topic_test","com.order.#");
} public void close() throws Exception{
this.channel.close();
this.connection.close();
} }
package com.redis.demo.rabbitmq;
import org.springframework.util.SerializationUtils;
import java.io.Serializable;
public class Producer extends EndPoint{
public Producer(String endpointName) throws Exception {
super(endpointName);
}
/**
* 发送消息
* @param object
* @throws Exception
*/
public void sendMessage(Serializable object) throws Exception {
//发送到队列
// channel.basicPublish("",endPointName, null, SerializationUtils.serialize(object));
//发送rount-key direct
// channel.basicPublish("direct_test","com.login.message",null,SerializationUtils.serialize(object));
//发送,群发各个业务线,匹配规则
channel.basicPublish("topic_test","com.order.create.success",null,SerializationUtils.serialize(object));
// channel.basicPublish("topic_test","com.order.sms",null,SerializationUtils.serialize(object));
// channel.basicPublish("topic_test","com.order.pay.ok",null,SerializationUtils.serialize(object));
}
}
package com.redis.demo.rabbitmq; import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;
import org.springframework.util.SerializationUtils; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; public class QueueConsumer extends EndPoint implements Runnable, Consumer {
public QueueConsumer(String endpointName) throws Exception {
super(endpointName);
} @Override
public void handleConsumeOk(String consumerTag) {
System.out.println("Consumer "+consumerTag +" registered");
} @Override
public void handleCancelOk(String s) { } @Override
public void handleCancel(String s) throws IOException { } @Override
public void handleShutdownSignal(String s, ShutdownSignalException e) { } @Override
public void handleRecoverOk(String s) {
System.out.println("handleRecoverOk "+s +" registered");
} @Override
public void handleDelivery(String s, Envelope envelope, AMQP.BasicProperties basicProperties, byte[] body) throws IOException {
System.out.println("handleDelivery "+s +" registered, type=" + basicProperties.getType());
Map map = (HashMap) SerializationUtils.deserialize(body);
System.out.println("Message Number "+ map.get("message number") + " received."); } @Override
public void run() {
try {
//start consuming messages. Auto acknowledge messages.
channel.basicConsume(endPointName, true,this);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.redis.demo.rabbitmq;
import java.util.HashMap;
public class MqTest {
public static void main(String[] args) throws Exception{
//启动线程接收消息
QueueConsumer consumer = new QueueConsumer("queue");
Thread consumerThread = new Thread(consumer);
consumerThread.start();
System.out.println("消费端启动完成===============");
Producer producer = new Producer("queue");
//发送消息
for (int i = 0; i < 10; i++) {
HashMap message = new HashMap();
message.put("message number", i);
//发送map对象
producer.sendMessage(message);
System.out.println("Message Number "+ i +" send success.");
}
}
}
3.pom jar导入
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.2</version>
</dependency>
java rabbitmq模拟生产者,消费者demo的更多相关文章
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- java简单模拟生产者消费者问题
本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
- 用Java写一个生产者-消费者队列
生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...
- Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...
- Java并发之:生产者消费者问题
生产者消费者问题是Java并发中的常见问题之一,在实现时,一般可以考虑使用juc包下的BlockingQueue接口,至于具体使用哪个类,则就需要根据具体的使用场景具体分析了.本文主要实现一个生产者消 ...
随机推荐
- 双龙贺岁,龙蜥 LoongArch GA 版正式发布
简介:Anolis OS 8.4 LoongArch 正式版发布产品包括 ISO.软件仓库.虚拟机镜像.容器镜像. 简介 继 Anolis OS LoongArch 预览版发布后,现迎来龙蜥 ...
- 开源 Serverless 里程碑:Knative 1.0 来了
简介:近期Knative发布了1.0版本,达到了一个重要的里程碑.Knative自2018年7月首次发布以来, 版本不断的迭代发展,除了无数的错误修复.稳定性和性能增强之外,按时间顺序还进行了一些改 ...
- 阿里云RDS深度定制-XA Crash Safe
简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库 ...
- WPF 解决 Skia 因为找不到字体而绘制不出中文字符
在 WPF 使用 Skia 做渲染工具,如果绘制的中文都是方块,也许是字体的问题.字体的问题是 Skia 没有找到字体,本文告诉大家如何修复 在 Skia 使用特定字体,可以使用 SkiaSharp ...
- 🎉 Socket.D v2.4.12 发布(新增 python 实现)
Socket.D 协议? Socket.D 是一个网络应用协议.在微服务.移动应用.物联网等场景,可替代 http.websocket 等.协议详情参考<官网介绍>. 支持: tcp, u ...
- LabView十六进制与字符串之间的转换
一.准备工具 Labview开发软件 字符串与十六进制的转换工具(做测试使用) 在线转换工具:IEE754浮点数16进制转换 本地工具如下图所示: 二.LabView字符串转换为十六进制 在数值中选择 ...
- 我第一个开源AI小产品-video2blog即将正式发布
前言 首先它是为了解决我自己的个人问题.不管能不能帮到你,或者对于看到的你是否有点利用价值,也没太大的关系,最起码你可以来看看我开发小产品的整个过程. 一段时间以来,我开始通过youtube平台来获取 ...
- Mybatis学习三(动态sql语句)
动态sql语句主要为以下语句 1.动态SQL:if 语句2.动态SQL:if+where 语句3.动态SQL:if+set 语句4.动态SQL:choose(when,otherwise) 语句5.动 ...
- 【Python基础】两个参数的for循环步长写法
一个参数for循环步长写法 >>> for i in range(1,10000,1000):print(i) ... 1 1001 2001 3001 4001 5001 6001 ...
- 多个docker容器如何共享网络
目录 多个docker容器如何共享网络 一.创建共享网络 二.docker-compose 启动容器共享网络 参考文档: 多个docker容器如何共享网络 一.创建共享网络 无论哪种方式,第一步都是创 ...