更新時間:2022-12-02 10:38:53 來源:動力節點 瀏覽1830次
Java實現消息隊列的方法有哪些?動力節點小編來告訴大家。
消息隊列是MQ是一種系統間相互協作的通信機制
Broker:消息處理中心,負責消息的接收、存儲、轉發等;
Producer:消息生產者,負責產生和發送消息到消息處理中心;
Consumer:消息消費者,負責從消息處理中心獲取消息,并進行相應的處理。
其結構如下所示:
(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)客戶端訪問
有了消息處理中心服務器后,自然需要相應客戶端來與之通信,來發送和接收消息。
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);
}
}
(3)運行效果
開啟BrokerServer服務
生產消息:ProduceClient
消費消息:ConsumeClient
以上就是動力節點小編介紹的"Java實現消息隊列的簡單方法",希望對大家有幫助,想了解更多可查看Java教程。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習