公司業務需要,要和其他公司進行協同開發,需要使用mq進行通訊,所以才會有此文章,總結踩過的坑。
既然要使用rabbitmq,我們首先要知道什麼是rabbitmq。rabbitmq是乙個訊息**,核心就是接受和傳送訊息。
訊息傳送原理執行乙個任務可能需要花費幾秒鐘,你可能會擔心如果乙個消費者在執行任務過程中掛掉了。基於現在的**,一旦rabbitmq將訊息分發給了消費者,就會從記憶體中刪除。在這種情況下,如果殺死正在執行任務的消費者,會丟失正在處理的訊息,也會丟失已經分發給這個消費者但尚未處理的訊息。
但是,我們不想丟失任何任務,如果有乙個消費者掛掉了,那麼我們應該將分發給它的任務交付給另乙個消費者去處理。
為了確保訊息不會丟失,rabbitmq支援訊息應答。消費者傳送乙個訊息應答,告訴rabbitmq這個訊息已經接收並且處理完畢了。rabbitmq可以刪除它了。
如果乙個消費者掛掉卻沒有傳送應答,rabbitmq會理解為這個訊息沒有處理完全,然後交給另乙個消費者去重新處理。這樣,你就可以確認即使消費者偶爾掛掉也不會不丟失任何訊息了。
沒有任何訊息超時限制;只有當消費者掛掉時,rabbitmq才會重新投遞。即使處理一條訊息會花費很長的時間。
訊息應答是預設開啟的。我們明確地把它們關掉了(autoack=true)。現在將應答開啟,一旦我們完成任務,消費者會自動傳送訊息應答。
channel.basicconsume(queue_name, autoack, consumer);
自動應答: 不在乎消費者對訊息處理是否成功,都會告訴佇列刪除訊息。如果處理訊息失敗,實現自動補償(佇列投遞過去 重新處理)。
public class consumer
};//牽手模式設定 預設自動應答模式 true:自動應答模式
channel.basicconsume(queue_name, false, defaultconsumerr);// fanse手動應答
//關閉通道和連線
channel.close();
connection.close();
}}
手動應答: 消費者處理完業務邏輯,手動返回ack(通知)告訴佇列處理完了,佇列進而刪除訊息。
public class consumer
};//模式設定 預設自動應答模式 true:自動應答模式
channel.basicconsume(queue_name, false, defaultconsumerr);// fanse手動應答
//關閉通道和連線
channel.close();
connection.close();
}}
rabbitMq使用心得
producer broker vhost exchange queen customer 路由 更靈活,許可權管理 高可用佇列 ttl exchange在和queue進行binding時會設定routingkey,這個routingkey是萬用字元 然後我們在將訊息傳送到exchange時會設定對...
frameset 使用心得
欲明白本篇 html徹底剖析 之標記分類,請看 標記一覽 也請先明白圍堵標記與空標記的分別,請看 html概念 框架概念 謂框架便是網頁畫面分成幾個框窗,同時取得多個 url。只需要 即可,面所有框架標記需要放在乙個總起的 html 檔,這個檔案只記錄了該框架如何分割 不會顯示任何資料,所以不必放入...
Access使用心得
今天臨時用access做資料庫,長期用sql server開發習慣了,總結一下現在為止用到的比較大的差異,以後有新的再補了 1 返回字串長度 len s lenb s 前者返回字元數,後者返回位元組數,並且access中text型別字元統一為2位元組,與sql2000不同。2 join的使用 acc...