本实例主要模拟一个一对一的消息队列处理:
声明队列:
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);//获取消息
}