简单队列

队列是只允许在表的一端(即队尾)进行插入操作,而在表的另一端(即队头)进行删除操作的线性表,即它按照“先进先出”的规则进行操作。记得先前学习重绘时存储记录的对象是用数组来存储,这很不方便,因为数组在定以后就固定了长度,这导致其所能存储的数据有限。而有了队列,就不必担心存储不够用。
/**
* 创建一个简单队列类
* @author 剑晨java
*/
public class Queue {
//初始数组
Object o[]=new Object[0];
/**放入方法*/
public void add(Object obj){
//每次调用在原始数组长度上加1
Object o1[]=new Object[o.length+1];
//把原始数组的数据复制到现在数组
for(int i=0;i<o.length;i++){
o1[i]=o[i];
}
//在现有数组后加上新加的数据
o1[o.length]=obj;
//把现在数组转化为原始数组
o=o1;
}
/**取出方法*/
public Object get(int num){
//System.out.println(o[num]);
return o[num];
}
/**长度方法*/
public int size(){
//System.out.println(o.length);
return o.length;
}

}
public class NChar {
static Queue q;
/**放入字符串到队列*/
public static Queue create(int n){
q=new Queue();
for(int i=0;i<100;i++){
String s="字符串"+i;
//调用队列方法
q.add(s);
}
return q;
}
/**取出队列存储的字符串*/
public static void printf( Queue q){
for(int j=0;j<q.size();j++){
Object o=q.get(j);
String s=(String)o;
System.out.println(s);

}

}
//程序入口
public static void main(String args[]){
//调用方法
create(10);
printf(q);


}
}
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(); } } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值