消息队列 | java简单实现

1. 消息队列介绍:

  • 消息队列是MQ是一种系统间相互协作的通信机制
    在这里插入图片描述
  • Broker:消息处理中心,负责消息的接收、存储、转发等;
  • Producer:消息生产者,负责产生和发送消息到消息处理中心;
  • Consumer:消息消费者,负责从消息处理中心获取消息,并进行相应的处理。

2. java设计一个简单的消息队列

其结构如下所示:
在这里插入图片描述

2.1 消息处理中心

作为消息处理中心,至少有一个数据容器来保存接收到的消息。这里采用java中队列(Queue)的一个子类ArrayBockingQueue来实现。
如下是消息处理中心Broker的实现:

import java.util.concurrent.ArrayBlockingQueue;

public class Broker {
     private final static int MAX_SIZE = 3;
     private static ArrayBlockingQueue<String> messageQueue = new ArrayBlockingQueue<>(MAX_SIZE);

     public static void produce(String msg){
         if(messageQueue.offer(msg)){
             System.out.println("成功向消息处理中心投递消息: " + msg + ",当前缓存的消息数量是:"+ messageQueue.size());
         } else{
             System.out.println("消息处理中心内暂存的消息达到最大负荷,不能继续放入消息!");
         }
         System.out.println("==============================");
     }

     public static String consume(){
         String msg = messageQueue.poll();
         if(msg != null){
             System.out.println("已经消费消息:" + msg + ",当前暂存的消息数量是:" + messageQueue.size());
         } else {
           System.out.println("消息处理中心内没有消息可供消费!");
         }
         System.out.println("==============================");
         return msg;
     }
}

有了消息处理中心类后,需要将该类的功能暴露出去,这样别人才能够用它来发送和接收消息。我们定义了BrokerServer类用来对外提供Broker类的服务。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class BrokerServer implements Runnable{
    
    public static int SERVICE_PORT = 9999;
    private final Socket socket;

    public BrokerServer(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run(){
        try(
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream()))
        {
            while (true){
                String str = in.readLine();
                if (str == null){
                    continue;
                }
                System.out.println("接收到原始数据: " + str);
                if (str.equals("CONSUME")){
                    String message = Broker.consume();
                    out.println(message);
                    out.flush();
                }else {
                    Broker.produce(str);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception{
        ServerSocket server = new ServerSocket(SERVICE_PORT);
        while(true){
            BrokerServer brokerServer = new BrokerServer(server.accept());
            new Thread(brokerServer).start();
        }
    }
}

在java中设计服务其功能的软件一般少不了套接字(Socket)和线程(Thread),需要通过线程的方式将应用启动起来,而服务器和应用的客户端需要用Socket进行网络通信。

2.2 客户端访问

有了消息处理中心服务器后,自然需要相应客户端来与之通信,来发送和接收消息。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class MyClient {
    public static void produce(String message) throws Exception{
        Socket socket = new Socket(InetAddress.getLocalHost(),BrokerServer.SERVICE_PORT);
        try(
                PrintWriter out = new PrintWriter(socket.getOutputStream())
                ){
            out.println(message);
            out.flush();
        }
    }

    public static String consume() throws Exception{
        Socket socket = new Socket(InetAddress.getLocalHost(),BrokerServer.SERVICE_PORT);
        try(
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(socket.getOutputStream())
                ){
            out.println("CONSUME");
            out.flush();
            String message = in.readLine();
            return message;
        }
    }
}

以上是通用的客户端访问代码,接下来分别看一个生产消息和消费消息的示例:
生产消息

public class ProduceClient {
    public static void main(String[] args) throws Exception{
        MyClient client = new MyClient();
        client.produce("hello World.");
    }
}

消费消息


public class ConsumeClient {
    public static void main(String[] args) throws Exception{
        MyClient client = new MyClient();

        String message = client.consume();
        System.out.println("获得的消息为: " + message);
    }
}

2.3 运行效果

  1. 开启BrokerServer服务
  2. 生产消息:ProduceClient
  3. 消费消息:ConsumeClient
    在这里插入图片描述
  • 1
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java实现消息队列的例子可以参考上述代码中的Broker.java和MqClient.java。在这个例子中,Broker类是消息处理中心,它使用ArrayBlockingQueue作为消息的数据容器。Broker类提供了produce方法用于生产消息,consume方法用于消费消息。MqClient类是与消息处理中心通信的客户端,它提供了produce方法用于发送消息,consume方法用于接收消息。Main类是一个示例程序,用于启动客户端并进行写入和读取操作。用户可以通过在控制台输入1来写入消息,输入2来消费消息。 中的代码展示了Broker类的实现,包括produce和consume方法。produce方法用于向消息队列中添加消息,如果队列已满则会提示队列已满;consume方法用于从消息队列中取出一条消息,如果队列为空则会提示队列是空的。 中的代码展示了MqClient类的实现,包括produce和consume方法。produce方法用于向消息处理中心发送消息,通过Socket连接进行通信;consume方法用于从消息处理中心接收消息,也通过Socket连接进行通信。 中的代码展示了Main类的实现,用于启动客户端并进行写入和读取操作。用户可以通过输入1来写入消息,通过输入2来消费消息。 综上所述,通过Broker、MqClient和Main类的组合实现Java消息队列的功能。用户可以通过客户端向消息处理中心发送消息,并从消息处理中心接收消息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java-简单消息队列实现](https://blog.csdn.net/cxu123321/article/details/108414848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值