RabbitMQ简单队列

本文介绍如何使用Spring Boot和RabbitMQ搭建简易消息队列,包括依赖引入、工具类编写、生产者与消费者创建过程,以及消息的发送与接收实现。

模型:
在这里插入图片描述
P:消息生产者
C:消费者
红色部分是消息队列

简单队列的使用
1、使用springboot,引入rabbitmq的依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
			<version>1.5.19.RELEASE</version>
		</dependency>

2、创建工具类获取连接

public class RabbitMqUtil {
	
	public static Connection getConnection() throws IOException, TimeoutException {
		//获取工厂,通过工厂创建连接
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("192.168.21.47");
		factory.setPort(5672);
		factory.setVirtualHost("/host1");
		factory.setUsername("admin");
		factory.setPassword("admin");
		
		Connection conn = null;
		conn = factory.newConnection();

		return conn;
	}
}

3、创建生产者

public class Provider {
	private static final String QUNUE_NAME="test_qunue";
	public static void main(String args[]) throws Exception {
		
		//获取rabbitMQ连接
		Connection conn = RabbitMqUtil.getConnection();
		//创建channel
		Channel channel = conn.createChannel();
		//创建队列声明
		channel.queueDeclare(QUNUE_NAME, false, false, false, null);
		//发送消息
		channel.basicPublish("", QUNUE_NAME, null, "hello world".getBytes());
		
		channel.close();
		conn.close();
	}
}

4、创建消费者

public class Reciver {
	private static final String QUNUE_NAME = "test_qunue";
	public static void main(String[] args) throws Exception {
		newApi();
	}

	public static void newApi()
			throws Exception {
		//获取连接
		Connection conn = RabbitMqUtil.getConnection();
		//创建channel
		Channel channel = conn.createChannel();
		//声明队列,如果生产者中声明了队列,消费者中可以不声明
		//channel.queueDeclare(QUNUE_NAME, false, false, false, null);
		//创建消费者
		Consumer consumer = new DefaultConsumer(channel) {
			//当生产者发送消息到rabbitmq之后,会自动触发消费者中的handleDelivery方法
			public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
					byte[] body) throws IOException {
				String msg = new String(body,"UTF-8");
				System.out.println(msg);
			}
		};
		//监听队列
		channel.basicConsume(QUNUE_NAME, true, consumer);
	}

	/**
	 * 过期的方式
	 * @throws Exception
	 */
	public static void oldApi()
			throws Exception {
		Connection conn = RabbitMqUtil.getConnection();
		Channel channel = conn.createChannel();
		QueueingConsumer consumer = new QueueingConsumer(channel);
		channel.basicConsume(QUNUE_NAME, true, consumer);

		while (true) {
			Delivery delivery = consumer.nextDelivery();
			String msg = new String(delivery.getBody());
			System.out.println(msg);
		}
	}
}

简单队列模型耦合度高,生产者消费者一一对应,如果存在多个消费者,那么该模型则无法使用,队列名如果更改,那么消费者需要同步修改。

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
RabbitMQ简单队列模型和工作队列模型存在以下区别: ### 模型结构 - **简单队列模型**:该模型结构极为简单,只包含一个生产者、一个队列和一个消费者。生产者直接将消息发送到指定队列,消费者从该队列接收消息,二者是一对一的关系。例如,在一个简单的日志记录系统中,一个服务作为生产者将日志消息发送到队列,另一个专门的日志处理服务作为消费者从队列中获取消息进行处理。 - **工作队列模型**:此模型包含一个生产者、一个队列和多个消费者。生产者将任务分发到队列中,多个消费者会从队列中按顺序获取并处理任务,形成一对多的关系。比如在一个电商系统中,订单处理服务作为生产者将订单任务放入队列,多个库存处理服务作为消费者从队列中获取订单任务进行库存扣减等操作,以此实现负载均衡 [^4]。 ### 应用场景 - **简单队列模型**:适用于任务处理逻辑简单、不需要进行负载均衡的场景。例如在一个小型的单用户系统中,用户提交的请求直接由一个单独的处理服务进行处理,使用简单队列模型就可以满足需求。 - **工作队列模型**:主要用于需要进行负载均衡的场景,能够确保任务均匀分配给不同的消费者,提升系统的整体处理能力。像大型的分布式系统中,大量的任务需要快速处理,通过多个消费者共同处理队列中的任务,可以有效提高系统的吞吐量 [^4]。 ### 消息处理方式 - **简单队列模型**:由于只有一个消费者,消息会依次被该消费者处理,不存在消息竞争的情况。例如,在一个简单的文件上传系统中,上传的文件消息依次被一个文件存储服务处理。 - **工作队列模型**:多个消费者会竞争队列中的消息,哪个消费者空闲就会获取消息进行处理。例如在一个数据处理集群中,多个节点作为消费者竞争处理队列中的数据任务,提高了处理效率。 ### 代码示例 #### 简单队列模型(Java 示例) ```java import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeoutException; // 生产者 public class SimpleQueueProducer { private static final String QUEUE_NAME = "simple_queue"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello, Simple Queue!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8)); System.out.println(" [x] Sent '" + message + "'"); } } } // 消费者 public class SimpleQueueConsumer { private static final String QUEUE_NAME = "simple_queue"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), StandardCharsets.UTF_8); System.out.println(" [x] Received '" + message + "'"); }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { }); } } ``` #### 工作队列模型(Java 示例) ```java import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeoutException; // 生产者 public class WorkQueueProducer { private static final String QUEUE_NAME = "work_queue"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { channel.queueDeclare(QUEUE_NAME, false, false, false, null); for (int i = 0; i < 10; i++) { String message = "Task " + i; channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8)); System.out.println(" [x] Sent '" + message + "'"); } } } } // 消费者 public class WorkQueueConsumer { private static final String QUEUE_NAME = "work_queue"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), StandardCharsets.UTF_8); System.out.println(" [x] Received '" + message + "'"); try { doWork(message); } finally { System.out.println(" [x] Done"); } }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { }); } private static void doWork(String task) { for (char ch : task.toCharArray()) { if (ch == '.') { try { Thread.sleep(1000); } catch (InterruptedException _ignored) { Thread.currentThread().interrupt(); } } } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值