1.生產者和消費者之間有時間上的相關性。訂閱一個主題的消費者只能消費自它訂閱之後發佈的消息。JMS 規範允許客戶創建持久訂閱,這在一定程度上放鬆了時間上的相關性要求。持久訂閱允許消費者消費它在未處於激活狀態時發送的消息。
2.訂閱者一和訂閱者二都能收到一樣的消息,也就是說在發佈訂閱模式下,一份消息可以被多個消費者消費
消息相關概念
消息類型
JMS 消息由以下三部分組成:
消息頭。每個消息頭字段都有相應的getter 和setter 方法。
消息屬性。如果需要除消息頭字段以外的值,那麼可以使用消息屬性。
消息體。消息主題內容,JMS定義消息包括TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage類型
消息確認
JMS 消息只有在被確認之後,才認爲已經被成功地消費了。消息的成功消費通
常包含三個階段:客戶接收消息、客戶處理消息和消息被確認。
在事務性會話中,當一個事務被提交的時候,確認自動發生。在非事務性會
話中,消息何時被確認取決於創建會話時的應答模式(acknowledgementmode)。
該參數有以下三個可選值:
Session.AUTO_ACKNOWLEDGE。當客戶成功的從receive方法返回的時候,
或者從MessageListener.onMessage 方法成功返回的時候,會話自動確認
客戶收到的消息。
Session.CLIENT_ACKNOWLEDGE。客戶通過消息的acknowledge 方法確認消
息。需要注意的是,在這種模式中,確認是在會話層上進行:確認一個被
消費的消息將自動確認所有已被會話消費的消息。例如,如果一個消息消
費者消費了10 個消息,然後確認第5 個消息,那麼所有10 個消息都被確
認。
Session.DUPS_ACKNOWLEDGE。該選擇只是會話遲鈍的確認消息的提交。如
果JMS provider 失敗,那麼可能會導致一些重複的消息。如果是重複的
消息,那麼JMS provider 必須把消息頭的JMSRedelivered 字段設置爲
true。
消息持久化
AMQ Message Store
AMQ Message Store 是ActiveMQ5.0缺省的持久化存儲。Message commands 被
保存到transactional journal(由rolling data logs 組成)。Messages 被保
存到data logs 中,同時被reference store 進行索引以提高存取速度。Date logs
由一些單獨的data log 文件組成,缺省的文件大小是32M,如果某個消息的大
小超過了data log 文件的大小,那麼可以修改配置以增加data log 文件的大小。
本人在學習RectiveMq的道路上遇見的一些問題,查詢各種資料,把解決的辦法總結。歡迎大家互相討論,謝謝。
歡迎大家加羣 進行討論 qq羣:714398799
-
去官網下載linux的RectiveMq。
http://activemq.apache.org/activemq-5140-release.html
-
把下載好的文件放在linux的opt目錄下(opt目錄是專門存放第三方軟件的目錄)
-
解壓
tar -zxvf apache-activemq-5.14.0-bin.tar.gz -
建立文件夾 activemq
mkdir activemq -
移動解壓好的文件並重命名
mv xxxx activemq -
普通啓動
./activemq start -
關閉
./activemq stop -
重啓
./activemq restart -
查看端口
ps -ef|grep activemq |grep -v grep
netstat -anp|grep 61616 -
測試訪問
win:192.168.x.xx
linux:192.168.xxx.x
通過 ping ip 測試網絡通
保證 linux服務器 防火牆關閉
本地電腦也要關閉防火牆 -
創建maven項目引入maven
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.14.4</version>
</dependency>
- 創建生產者
//linux服務器
private static final String BROKER_URL = "tcp://192.xx.xxx.xx8:61616";
private static final String producer = "queue";
public static void main(String[] args) throws JMSException {
//建立生產者
ActiveMQConnectionFactory connectionFaction = new ActiveMQConnectionFactory(BROKER_URL);
Connection connection = connectionFaction.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(producer);
MessageProducer producer = session.createProducer(queue);
for (int i=0;i<3;i++){
TextMessage textMessage = session.createTextMessage("msg-----" + i);
producer.send(textMessage);
}
producer.close();
session.close();
connection.close();
System.out.println("send msg success");
}
- 通過activeMq8161端口來看你寫的消息
14.創建消費者
private static final String BROKER_URL = "tcp://192.168.xxx.xxx:61616";
private static final String producer = "queue";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory connectionFaction = new ActiveMQConnectionFactory(BROKER_URL);
Connection connection = connectionFaction.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//創建
Queue queue = session.createQueue(producer);
MessageConsumer consumer = session.createConsumer(queue);
while (true){
TextMessage receive = (TextMessage)consumer.receive();
if(null != receive){
System.out.println(receive.getText());
}else{
break;
}
}
consumer.close();
session.close();
connection.close();
System.out.println("成功消費mq");
}
執行完畢後,在管理界面,可以看到自己的信息個數,被消費了,消費者數量。
注意
- 如果需要把消息存儲mysql,需要把mysql驅動包放在activemq的lib下
- 我在安裝的過程中,遇見的關閉linux服務器防火牆,關閉方法按照百度的方法爲 service iptables stop,最後原來因爲是,centos7之後的關閉防火牆方法爲
關閉防火牆
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
開啓端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
- Queue(點到點)模式
在點對點的傳輸方式中,消息數據被持久化,每條消息都能被消費,沒有監聽QUEUE地址也能被消費,數據不會丟失,一對一的發佈接受策略,保證數據完整 - 主題模式
一對多的傳輸方式