本文目錄一覽:
- 1、到底什麼是消息隊列?Java中如何實現消息隊列
- 2、Java開發需要哪些技術?
- 3、Java開發中消息隊列和rpc框架都是做什麼的?
- 4、消息隊列概念
- 5、如何用JAVA實現Linux上的消息隊列功能
- 6、在JAVA中怎麼實現消息隊列
到底什麼是消息隊列?Java中如何實現消息隊列
消息隊列,顧名思義首先是個隊列。隊列的操作有入隊和出隊也就是有一個程序在產生內容然後入隊(生產者)另一個程序讀取內容,內容出隊(消費者)這是最最基本的概念。java中的消息隊列消息隊列是線程間通訊的手段:importjava.util.*p
Java開發需要哪些技術?
Java開發需要掌握以下技術:1、掌握Java語言的使用:語言語法、程序邏輯,OOP(面向對象)思想,封裝、繼承、多態,集合框架、泛型、File I\O技術,多線程技術、socket網路編程,XML技術。編程有關的操作系統基本使用,HTML5規範、HTML5文檔結構、HTML5元素、Web語義化;CSS3規範、CSS3選擇器、層疊與繼承、盒模型與視覺格式化模型、現代CSS布局、CSS3基本屬性千鋒教育就有線上免費Java線上公開課。 2、掌握Java Web開發技術:Java開發中使用到的Web前端技術,HTML5+CSS3,JavaScript操作BOM和DOM,JQuery的選擇器、事件處理、動畫效果,MySQL資料庫技術,JDBC技術、JSP、Servlet、EL和JSTL、過濾器和監聽器、AJax非同步請求等,Linux技術、SVN、Linux環境下項目發布部署等。3、掌握使用流行框架SSM\SSH技術實現企業級項目開發:重點學習MyBatis、Spring、Spring MVC框架的應用,Git、Java設計模式等,重點學習Struts2 、Spring、Hibernate框架的應用,Maven、Oracle資料庫應用技術,了解大數據生態體系,Hadoop基礎入門。4、JavaWeb框架:Spring體系結構、Spring IOC、AOP、FactoryBean與BeanFactory、聲明性事務處理、Spring 5新特性。Maven與Gradle的使用。Spring Boot自動配置、Spring Boot CLI與Initializr、Spring Boot Starter、Actuator。SpringMVC工作原理和工作流程;攔截器、數據綁定轉換和格式化、全局異常處理、轉發與重定向、AJAX請求處理。如果想了解更多相關知識,建議到千鋒教育了解一下。千鋒教育總部位於北京,已在18個城市成立分公司,現有教研講師團隊300餘人,每年培養泛IT人才近2萬人,十年間累計培養超10餘萬泛IT人才 。
Java開發中消息隊列和rpc框架都是做什麼的?
一,消息隊列服務一般用於設計多系統之間的信息傳輸,一般這種傳輸不需要對方對數據做出回應。它最常見的方式是構建非同步的生產者-消費者模式。我們在系統開發中,有些業務並不需要及時返回結果,我們可以把這些操作放到隊列中,然後另起一個消費者去處理它。比如日誌,資料庫非同步更新。
二,rpc一般是用於伺服器與伺服器進程之間通信,這種通信有請求和應答。它是建立在底層的socket通信之上的。封裝為rpc之後,更加方便建立通信。就像在同一個進程中調用對方的方法一樣。它本地的方法名一般和請求到達的伺服器的方法名一一對應。這樣可以更好的把模塊劃分。所以它是應對分散式而生的。比如一個網站,一開始可能所有的服務在一個進程中,但是隨著業務的增長,一個進程處理不過來,這時就需要把業務拆分成多個,分部到不同的機器上去。
消息隊列概念
消息本質上是一種數據結構(當然,對象也可以看做是一種特殊的消息),它包含消費者與服務雙方都能識別的數據,這些數據需要在不同的進程(機器)之間進行傳遞,並可能會被多個完全不同的客戶端消費
隊列(Queue) ,是先進先出(FIFO, First-In-First-Out)的線性表,通俗的講隊列就是一群人或者事物按照排好的順序等待接受服務或者處理
本地隊列按照功能可劃分為初始化隊列,傳輸隊列,目標隊列和死信隊列。初始化隊列用作消息觸發功能。傳輸隊列只是暫存待傳的消息,條件許可的情況下,通過管道將消息傳送到其他的隊列管理器。目標隊列是消息的目的地,可以長期存放消息。如果消息不能送達目標隊列,也不能再路由出去,則被自動放入死信隊列保存。
只是一個隊列定義,用來指定遠端隊列管理器的隊列。使用了遠程隊列,程序就不需要知道目標隊列的位置。
模型隊列定義了一套本地隊列的屬性結合,一旦打開模型隊列,隊列管理器會按照這些屬性動態地創建出一個本地隊列。
MQ全稱(Message Queue)又名 消息隊列 ,是一種 非同步通訊 的 中間件 。可以將它理解成郵局,發送者將消息傳遞到郵局,然後由郵局幫我們發送給具體的消息接收者(消費者),具體發送過程與時間我們無需關心,它也不會干擾我進行其它事情。
它被廣泛的應用與跨平台、跨系統的分散式系統之間,為它們提供高效可靠的非同步傳輸機制
JMS(JAVA Message Service,java消息服務)是java的消息服務 JMS是一套 API,是j2EE標準的一部分。
JMS是由Sun公司早期提出的消息標準,旨在為java應用提供統一的消息操作,包括create、send、receive等
JMS是Java Enterprise Edition的一部分。從使用角度看,JMS和JDBC擔任差不多的角色,用戶都是根據相應的介面可以和實現了JMS的服務進行通信,進行相關的操作
結構圖
說明
使用 隊列(Queue) 作為消息通信載體;滿足 生產者與消費者模式 ,一條消息只能被一個消費者使用,未被消費的消息在隊列中保留直到被消費或超時。比如:我們生產者發送100條消息的話,兩個消費者來消費一般情況下兩個消費者會按照消息發送的順序各自消費一半(也就是你一個我一個的消費。)
結構圖
說明
發布訂閱模型(Pub/Sub) 使用 主題(Topic) 作為消息通信載體,類似於 廣播模式 ;發布者發布一條消息,該消息通過主題傳遞給所有的訂閱者, 在一條消息廣播之後才訂閱的用戶則是收不到該條消息的 。
AMQP(advanced message queuing protocol) 是一個提供統一消息服務的應用層標準協議,基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品,可以跨語法開發
AMQP是一種協議,更準確的說是一種binary wire-level protocol(鏈接協議),兼容JMS
如何用JAVA實現Linux上的消息隊列功能
下面來說說如何用不用消息隊列來進行進程間的通信,消息隊列與命名管道有很多相似之處。有關命名管道的更多內容可以參閱我的另一篇文章:Linux進程間通信——使用命名管道
一、什麼是消息隊列
消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。 每個數據塊都被認為含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。我們可以通過發送消息來避免命名管道的同步和阻塞問題。但是消息隊列與命名管道一樣,每個數據塊都有一個最大長度的限制。
Linux用宏MSGMAX和MSGMNB來限制一條消息的最大長度和一個隊列的最大長度。
二、在Linux中使用消息隊列
Linux提供了一系列消息隊列的函數介面來讓我們方便地使用它來實現進程間的通信。它的用法與其他兩個System V PIC機制,即信號量和共享內存相似。
1、msgget函數
該函數用來創建和訪問一個消息隊列。它的原型為:
int msgget(key_t, key, int msgflg);
與其他的IPC機制一樣,程序必須提供一個鍵來命名某個特定的消息隊列。msgflg是一個許可權標誌,表示消息隊列的訪問許可權,它與文件的訪問許可權一樣。msgflg可以與IPC_CREAT做或操作,表示當key所命名的消息隊列不存在時創建一個消息隊列,如果key所命名的消息隊列存在時,IPC_CREAT標誌會被忽略,而只返回一個標識符。
它返回一個以key命名的消息隊列的標識符(非零整數),失敗時返回-1.
2、msgsnd函數
該函數用來把消息添加到消息隊列中。它的原型為:
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
msgid是由msgget函數返回的消息隊列標識符。
msg_ptr是一個指向準備發送消息的指針,但是消息的數據結構卻有一定的要求,指針msg_ptr所指向的消息結構一定要是以一個長整型成員變數開始的結構體,接收函數將用這個成員來確定消息的類型。所以消息結構要定義成這樣:
struct my_message{
long int message_type;
/* The data you wish to transfer*/
};
msg_sz是msg_ptr指向的消息的長度,注意是消息的長度,而不是整個結構體的長度,也就是說msg_sz是不包括長整型消息類型成員變數的長度。
msgflg用於控制當前消息隊列滿或隊列消息到達系統範圍的限制時將要發生的事情。
如果調用成功,消息數據的一分副本將被放到消息隊列中,並返回0,失敗時返回-1.
3、msgrcv函數
該函數用來從一個消息隊列獲取消息,它的原型為
int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
msgid, msg_ptr, msg_st的作用也函數msgsnd函數的一樣。
msgtype可以實現一種簡單的接收優先順序。如果msgtype為0,就獲取隊列中的第一個消息。如果它的值大於零,將獲取具有相同消息類型的第一個信息。如果它小於零,就獲取類型等於或小於msgtype的絕對值的第一個消息。
msgflg用於控制當隊列中沒有相應類型的消息可以接收時將發生的事情。
調用成功時,該函數返回放到接收緩存區中的位元組數,消息被複制到由msg_ptr指向的用戶分配的緩存區中,然後刪除消息隊列中的對應消息。失敗時返回-1.
4、msgctl函數
該函數用來控制消息隊列,它與共享內存的shmctl函數相似,它的原型為:
int msgctl(int msgid, int command, struct msgid_ds *buf);
command是將要採取的動作,它可以取3個值,
IPC_STAT:把msgid_ds結構中的數據設置為消息隊列的當前關聯值,即用消息隊列的當前關聯值覆蓋msgid_ds的值。
IPC_SET:如果進程有足夠的許可權,就把消息列隊的當前關聯值設置為msgid_ds結構中給出的值
IPC_RMID:刪除消息隊列
buf是指向msgid_ds結構的指針,它指向消息隊列模式和訪問許可權的結構。msgid_ds結構至少包括以下成員:
struct msgid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
成功時返回0,失敗時返回-1.
三、使用消息隊列進行進程間通信
馬不停蹄,介紹完消息隊列的定義和可使用的介面之後,我們來看看它是怎麼讓進程進行通信的。由於可以讓不相關的進程進行行通信,所以我們在這裡將會編寫兩個程序,msgreceive和msgsned來表示接收和發送信息。根據正常的情況,我們允許兩個程序都可以創建消息,但只有接收者在接收完最後一個消息之後,它才把它刪除。
接收信息的程序源文件為msgreceive.c的源代碼為:
#include unistd.h
#include stdlib.h
#include stdio.h
#include string.h
#include errno.h
#include sys/msg.h
struct msg_st
{
long int msg_type;
char text[BUFSIZ];
};
int main()
{
int running = 1;
int msgid = -1;
struct msg_st data;
long int msgtype = 0; //注意1
//建立消息隊列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, “msgget failed with error: %d\n”, errno);
exit(EXIT_FAILURE);
}
//從隊列中獲取消息,直到遇到end消息為止
while(running)
{
if(msgrcv(msgid, (void*)data, BUFSIZ, msgtype, 0) == -1)
{
fprintf(stderr, “msgrcv failed with errno: %d\n”, errno);
exit(EXIT_FAILURE);
}
printf(“You wrote: %s\n”,data.text);
//遇到end結束
if(strncmp(data.text, “end”, 3) == 0)
running = 0;
}
//刪除消息隊列
if(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, “msgctl(IPC_RMID) failed\n”);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
發送信息的程序的源文件msgsend.c的源代碼為:
#include unistd.h
#include stdlib.h
#include stdio.h
#include string.h
#include sys/msg.h
#include errno.h
#define MAX_TEXT 512
struct msg_st
{
long int msg_type;
char text[MAX_TEXT];
};
int main()
{
int running = 1;
struct msg_st data;
char buffer[BUFSIZ];
int msgid = -1;
//建立消息隊列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, “msgget failed with error: %d\n”, errno);
exit(EXIT_FAILURE);
}
//向消息隊列中寫消息,直到寫入end
while(running)
{
//輸入數據
printf(“Enter some text: “);
fgets(buffer, BUFSIZ, stdin);
data.msg_type = 1; //注意2
strcpy(data.text, buffer);
//向隊列發送數據
if(msgsnd(msgid, (void*)data, MAX_TEXT, 0) == -1)
{
fprintf(stderr, “msgsnd failed\n”);
exit(EXIT_FAILURE);
}
//輸入end結束輸入
if(strncmp(buffer, “end”, 3) == 0)
running = 0;
sleep(1);
}
exit(EXIT_SUCCESS);
}
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
在JAVA中怎麼實現消息隊列
如下:
public static String do_post(String url, ListNameValuePair name_value_pair) throws IOException {
String body = “{}”;
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpPost httpost = new HttpPost(url);
httpost.setEntity(new UrlEncodedFormEntity(name_value_pair, StandardCharsets.UTF_8));
HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
body = EntityUtils.toString(entity);
} finally {
httpclient.getConnectionManager().shutdown();
}
return body;
}
public static String do_get(String url) throws ClientProtocolException, IOException {
String body = “{}”;
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
body = EntityUtils.toString(entity);
} finally {
httpclient.getConnectionManager().shutdown();
}
return body;
}
原創文章,作者:SOSZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/139468.html