java实现简单的消息队列模型(BIO)

本实例主要模拟一个一对一的消息队列处理:

声明队列:

package com.bai.testbio;

import java.util.LinkedList;

public class JmsBuffer {
	// 队列 最大存储量
	private final static int  MAX_SIZE = 2;
	// 消息队列
	private static LinkedList<String> jmsQueue=new LinkedList<String>(); 
	static JmsBuffer buffer;
	// 生产消息
    public static void produce(String str) {  
        // 同步代码段  
        synchronized (jmsQueue) {  
            // 如果仓库剩余容量不足  
            while (jmsQueue.size()> MAX_SIZE) {  
                System.out.println("你要生产的消息为" + "/t【库存量】:"  
                        + jmsQueue.size() + "/t暂时不能执行生产任务!");  
                try {  
                    // 由于条件不满足,生产阻塞  
                	jmsQueue.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
  
            // 生产条件满足情况下,生产消息  
           
            jmsQueue.add(str);  
           
            System.out.println("已经生产该消息" + str + "/t【现仓储量为】:" + jmsQueue.size());  
  
            jmsQueue.notifyAll();  
        }  
    }  
  
    // 消费消息
    public static String consume() {  
        // 同步代码段  
        synchronized (jmsQueue) {  
            // 如果仓库存储量不足  
            while (jmsQueue.size() > MAX_SIZE) {  
                System.out.println("【消息库存量】:"  
                        + jmsQueue.size() + "/t暂时不能执行生产任务!");  
                try {  
                    // 由于条件不满足,消费阻塞  
                	jmsQueue.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
  
            // 消费条件满足情况下,消费该消息 
          
            String str=(String) jmsQueue.removeLast();   
  
            System.out.println("【已经消费该消息】:" + str+ "/t【现仓储量为】:" + jmsQueue.size());  
  
           jmsQueue.notifyAll();  
           return str;
        }  
    }  
    public synchronized static JmsBuffer getJmsBuffer(){
    	if(buffer==null){
    		return new JmsBuffer();
    	}else{
    		return buffer;
    	}
    }
}

使用BIO实现一个服务端:

package com.bai.testbio;

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

public class Server extends Thread {
	private final Socket client;
	public Server(Socket c) {
		this.client = c;
	}
	
	public Socket getClient() {
		return client;
	}
 
	@Override
	public void run() {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			PrintWriter out = new PrintWriter(client.getOutputStream());
			while (true) {
				String str = in.readLine();
				if(str.contains("produce")){ //produce代表生产消息
					//生产消息
					JmsBuffer.produce(str);
				}
				if(str.contains("consume")){ //consume代表消费消息
					String messag=JmsBuffer.consume();
			             out.println(messag);
			             out.flush(); 	
				}
				System.out.println(str);
				out.flush();
				if (str.equals("end"))
					break;
			}
			client.close();
		} catch (IOException ex) {
		} finally {
		}
	}
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(5678);
		while (true) {
			Server mc = new Server(server.accept());
			mc.start();
		}
	}
}

声明一个客户端:

package com.bai.testbio;

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

public class Client {
	static Socket server;
	public static void creaSockeet() throws UnknownHostException, IOException{
		server = new Socket(InetAddress.getLocalHost(), 5678); 
	}
	//发布消息
    public static void pub(String message) throws UnknownHostException, IOException{ 
         BufferedReader in = new BufferedReader(new InputStreamReader(  
                 server.getInputStream()));  
         PrintWriter out = new PrintWriter(server.getOutputStream());  
             out.println(message);
             out.flush(); 	
             System.out.println(in.readLine());   
         server.close();  
    }
    //发布消息
    public static String sub(String code) throws UnknownHostException, IOException{ 
         BufferedReader in = new BufferedReader(new InputStreamReader(  
                 server.getInputStream()));  
         PrintWriter out = new PrintWriter(server.getOutputStream());  
             out.println(code);
             out.flush(); 	
             String str = in.readLine();
             System.out.println(str); 
             System.out.println("获取的消息为:"+str);
         //server.close();  
         return str;
    }
}

测试:

public static void main(String[] args) throws Exception {
		Client client=new Client();
		client.creaSockeet();
		StringBuilder builder=new StringBuilder("perduce"); //消息标示
		builder.append("content:你好吗?");
		client.pub(builder.toString());
	}
public static void main(String[] args) throws Exception {
		Client client=new Client();
		client.creaSockeet();
		StringBuilder builder=new StringBuilder("consumer"); //消息标示
		String message=client.sub(builder.toString());
		System.out.println("获取的消息为:"+message);//获取消息
	}

猜你喜欢

转载自blog.csdn.net/qq_38836082/article/details/84634309