欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java消息隊(duì)列異步代碼 java消息隊(duì)列異步處理任務(wù)

到底什么是消息隊(duì)列?Java中如何實(shí)現(xiàn)消息隊(duì)列

“消息隊(duì)列”是在消息的傳輸過程中保存消息的容器。和我們學(xué)過的LinkedHashMap,TreeSet等一樣,都是容器。既然是容器,就有有自己的特性,就像LinkedHashMap是以鍵值對(duì)存儲(chǔ)。存取順序不變。而消息隊(duì)列,看到隊(duì)列就可以知道。這個(gè)容器里面的消息是站好隊(duì)的,一般遵從先進(jìn)先出原則。

海湖新網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),海湖新網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為海湖新上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的海湖新做網(wǎng)站的公司定做!

java中已經(jīng)為我們封裝好了很多的消息隊(duì)列。在java 1.5版本時(shí)推出的java.util.concurrent中有很多現(xiàn)成的隊(duì)列供我們使用。特性繁多,種類齊全。是你居家旅游開發(fā)必備QAQ。

下面簡(jiǎn)單列舉這個(gè)包中的消息隊(duì)列

:阻塞隊(duì)列 BlockingQueue

數(shù)組阻塞隊(duì)列 ArrayBlockingQueue

延遲隊(duì)列 DelayQueue

鏈阻塞隊(duì)列 LinkedBlockingQueue

具有優(yōu)先級(jí)的阻塞隊(duì)列 PriorityBlockingQueue

同步隊(duì)列 SynchronousQueue

阻塞雙端隊(duì)列 BlockingDeque

鏈阻塞雙端隊(duì)列 LinkedBlockingDeque

不同的隊(duì)列不同的特性決定了隊(duì)列使用的時(shí)機(jī),感興趣的話你可以詳細(xì)了解。具體的使用方式我就不贅述了

java 異步發(fā)送短信,異步怎么實(shí)現(xiàn)

java 異步發(fā)送短信,異步實(shí)現(xiàn):

1,使用spring框架的異步注解 @Async ,底層應(yīng)該是一個(gè)線程。

2,簡(jiǎn)單粗暴的方式:開一個(gè)線程

new Thread(new Runnable() {

public void run() {

//發(fā)送短信

}

}).start();

當(dāng)然也可以高級(jí)一點(diǎn),使用線程池。

3,更高端一點(diǎn):使用消息隊(duì)列MQ

在JAVA中怎么實(shí)現(xiàn)消息隊(duì)列

如下:

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;

}

如何用JAVA實(shí)現(xiàn)Linux上的消息隊(duì)列功能

下面來說說如何用不用消息隊(duì)列來進(jìn)行進(jìn)程間的通信,消息隊(duì)列與命名管道有很多相似之處。有關(guān)命名管道的更多內(nèi)容可以參閱我的另一篇文章:Linux進(jìn)程間通信——使用命名管道

一、什么是消息隊(duì)列

消息隊(duì)列提供了一種從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送一個(gè)數(shù)據(jù)塊的方法。 每個(gè)數(shù)據(jù)塊都被認(rèn)為含有一個(gè)類型,接收進(jìn)程可以獨(dú)立地接收含有不同類型的數(shù)據(jù)結(jié)構(gòu)。我們可以通過發(fā)送消息來避免命名管道的同步和阻塞問題。但是消息隊(duì)列與命名管道一樣,每個(gè)數(shù)據(jù)塊都有一個(gè)最大長(zhǎng)度的限制。

Linux用宏MSGMAX和MSGMNB來限制一條消息的最大長(zhǎng)度和一個(gè)隊(duì)列的最大長(zhǎng)度。

二、在Linux中使用消息隊(duì)列

Linux提供了一系列消息隊(duì)列的函數(shù)接口來讓我們方便地使用它來實(shí)現(xiàn)進(jìn)程間的通信。它的用法與其他兩個(gè)System V PIC機(jī)制,即信號(hào)量和共享內(nèi)存相似。

1、msgget函數(shù)

該函數(shù)用來創(chuàng)建和訪問一個(gè)消息隊(duì)列。它的原型為:

int msgget(key_t, key, int msgflg);

與其他的IPC機(jī)制一樣,程序必須提供一個(gè)鍵來命名某個(gè)特定的消息隊(duì)列。msgflg是一個(gè)權(quán)限標(biāo)志,表示消息隊(duì)列的訪問權(quán)限,它與文件的訪問權(quán)限一樣。msgflg可以與IPC_CREAT做或操作,表示當(dāng)key所命名的消息隊(duì)列不存在時(shí)創(chuàng)建一個(gè)消息隊(duì)列,如果key所命名的消息隊(duì)列存在時(shí),IPC_CREAT標(biāo)志會(huì)被忽略,而只返回一個(gè)標(biāo)識(shí)符。

它返回一個(gè)以key命名的消息隊(duì)列的標(biāo)識(shí)符(非零整數(shù)),失敗時(shí)返回-1.

2、msgsnd函數(shù)

該函數(shù)用來把消息添加到消息隊(duì)列中。它的原型為:

int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);

msgid是由msgget函數(shù)返回的消息隊(duì)列標(biāo)識(shí)符。

msg_ptr是一個(gè)指向準(zhǔn)備發(fā)送消息的指針,但是消息的數(shù)據(jù)結(jié)構(gòu)卻有一定的要求,指針msg_ptr所指向的消息結(jié)構(gòu)一定要是以一個(gè)長(zhǎng)整型成員變量開始的結(jié)構(gòu)體,接收函數(shù)將用這個(gè)成員來確定消息的類型。所以消息結(jié)構(gòu)要定義成這樣:

struct my_message{

long int message_type;

/* The data you wish to transfer*/

};

msg_sz是msg_ptr指向的消息的長(zhǎng)度,注意是消息的長(zhǎng)度,而不是整個(gè)結(jié)構(gòu)體的長(zhǎng)度,也就是說msg_sz是不包括長(zhǎng)整型消息類型成員變量的長(zhǎng)度。

msgflg用于控制當(dāng)前消息隊(duì)列滿或隊(duì)列消息到達(dá)系統(tǒng)范圍的限制時(shí)將要發(fā)生的事情。

如果調(diào)用成功,消息數(shù)據(jù)的一分副本將被放到消息隊(duì)列中,并返回0,失敗時(shí)返回-1.

3、msgrcv函數(shù)

該函數(shù)用來從一個(gè)消息隊(duì)列獲取消息,它的原型為

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);

msgid, msg_ptr, msg_st的作用也函數(shù)msgsnd函數(shù)的一樣。

msgtype可以實(shí)現(xiàn)一種簡(jiǎn)單的接收優(yōu)先級(jí)。如果msgtype為0,就獲取隊(duì)列中的第一個(gè)消息。如果它的值大于零,將獲取具有相同消息類型的第一個(gè)信息。如果它小于零,就獲取類型等于或小于msgtype的絕對(duì)值的第一個(gè)消息。

msgflg用于控制當(dāng)隊(duì)列中沒有相應(yīng)類型的消息可以接收時(shí)將發(fā)生的事情。

調(diào)用成功時(shí),該函數(shù)返回放到接收緩存區(qū)中的字節(jié)數(shù),消息被復(fù)制到由msg_ptr指向的用戶分配的緩存區(qū)中,然后刪除消息隊(duì)列中的對(duì)應(yīng)消息。失敗時(shí)返回-1.

4、msgctl函數(shù)

該函數(shù)用來控制消息隊(duì)列,它與共享內(nèi)存的shmctl函數(shù)相似,它的原型為:

int msgctl(int msgid, int command, struct msgid_ds *buf);

command是將要采取的動(dòng)作,它可以取3個(gè)值,

IPC_STAT:把msgid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為消息隊(duì)列的當(dāng)前關(guān)聯(lián)值,即用消息隊(duì)列的當(dāng)前關(guān)聯(lián)值覆蓋msgid_ds的值。

IPC_SET:如果進(jìn)程有足夠的權(quán)限,就把消息列隊(duì)的當(dāng)前關(guān)聯(lián)值設(shè)置為msgid_ds結(jié)構(gòu)中給出的值

IPC_RMID:刪除消息隊(duì)列

buf是指向msgid_ds結(jié)構(gòu)的指針,它指向消息隊(duì)列模式和訪問權(quán)限的結(jié)構(gòu)。msgid_ds結(jié)構(gòu)至少包括以下成員:

struct msgid_ds

{

uid_t shm_perm.uid;

uid_t shm_perm.gid;

mode_t shm_perm.mode;

};

成功時(shí)返回0,失敗時(shí)返回-1.

三、使用消息隊(duì)列進(jìn)行進(jìn)程間通信

馬不停蹄,介紹完消息隊(duì)列的定義和可使用的接口之后,我們來看看它是怎么讓進(jìn)程進(jìn)行通信的。由于可以讓不相關(guān)的進(jìn)程進(jìn)行行通信,所以我們?cè)谶@里將會(huì)編寫兩個(gè)程序,msgreceive和msgsned來表示接收和發(fā)送信息。根據(jù)正常的情況,我們?cè)试S兩個(gè)程序都可以創(chuàng)建消息,但只有接收者在接收完最后一個(gè)消息之后,它才把它刪除。

接收信息的程序源文件為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

//建立消息隊(duì)列

msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

if(msgid == -1)

{

fprintf(stderr, "msgget failed with error: %d\n", errno);

exit(EXIT_FAILURE);

}

//從隊(duì)列中獲取消息,直到遇到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結(jié)束

if(strncmp(data.text, "end", 3) == 0)

running = 0;

}

//刪除消息隊(duì)列

if(msgctl(msgid, IPC_RMID, 0) == -1)

{

fprintf(stderr, "msgctl(IPC_RMID) failed\n");

exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);

}

發(fā)送信息的程序的源文件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;

//建立消息隊(duì)列

msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

if(msgid == -1)

{

fprintf(stderr, "msgget failed with error: %d\n", errno);

exit(EXIT_FAILURE);

}

//向消息隊(duì)列中寫消息,直到寫入end

while(running)

{

//輸入數(shù)據(jù)

printf("Enter some text: ");

fgets(buffer, BUFSIZ, stdin);

data.msg_type = 1; //注意2

strcpy(data.text, buffer);

//向隊(duì)列發(fā)送數(shù)據(jù)

if(msgsnd(msgid, (void*)data, MAX_TEXT, 0) == -1)

{

fprintf(stderr, "msgsnd failed\n");

exit(EXIT_FAILURE);

}

//輸入end結(jié)束輸入

if(strncmp(buffer, "end", 3) == 0)

running = 0;

sleep(1);

}

exit(EXIT_SUCCESS);

}

轉(zhuǎn)載僅供參考,版權(quán)屬于原作者。祝你愉快,滿意請(qǐng)采納哦

Java 開源消息隊(duì)列ActiveMQ等

你這個(gè)Queue是一個(gè)在內(nèi)存里的數(shù)據(jù)結(jié)構(gòu)類,提供了入隊(duì)出隊(duì)方法。實(shí)例化以后可以使用。

MessageQueue是一個(gè)Java的協(xié)議,是基于標(biāo)準(zhǔn)的,ActiveMQ是這個(gè)協(xié)議標(biāo)準(zhǔn)的具體實(shí)現(xiàn)。這個(gè)隊(duì)列具有MessageQueue的通用功能,例如支持:發(fā)布者-訂閱者,點(diǎn)到點(diǎn)的多種方式。用于SOA的大型分布式環(huán)境,12306搶票的時(shí)候你看見有多少人排隊(duì)等待,就是使用的這個(gè)。

12306的后臺(tái)服務(wù)器是分布式的,比如接受訂票功能有100臺(tái)服務(wù)器,一個(gè)LinkedBlockingQueue的范圍只是一臺(tái)機(jī)器,這樣的話就會(huì)出現(xiàn)多個(gè)隊(duì),而且功能單一。這時(shí)候就會(huì)把訂票請(qǐng)求發(fā)送給MessageQueue ,這個(gè)東西是分布式、異步的。。。。是完全不同的兩個(gè)東西,沒有可比性

當(dāng)前標(biāo)題:java消息隊(duì)列異步代碼 java消息隊(duì)列異步處理任務(wù)
地址分享:http://chinadenli.net/article30/hghoso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航外貿(mào)建站網(wǎng)站策劃網(wǎng)站維護(hù)做網(wǎng)站關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)