ActiveMQ學習總結——(三)Topic主題模式示例
阿新 • • 發佈:2019-01-23
和佇列模式相似,分別編寫生產者和訂閱者。
生產者:
package com.jms.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 訊息生產者
* @author root
*
*/
public class AppProducer {
private static final String url="tcp://127.0.0.1:61616";//服務地址,埠預設61616
private static final String topicName="topic-test";//要建立的訊息名稱
public static void main(String[] args) throws JMSException {
//1.建立ConnectiongFactory,繫結地址
ConnectionFactory factory=new ActiveMQConnectionFactory(url);
//2.建立Connection
Connection connection= factory.createConnection();
//3.啟動連線
connection.start();
//4.建立會話
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.建立一個目標
Destination destination=session.createTopic(topicName);
//6.建立一個生產者
MessageProducer producer=session.createProducer(destination);
for (int i = 0; i < 100; i++) {
//7.建立訊息
TextMessage textMessage=session.createTextMessage("哈哈哈哈哈:"+i);
//8.傳送訊息
producer.send(textMessage);
System.out.println("傳送訊息:"+i);
}
connection.close();
}
}
訂閱者:
package com.jms.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 訂閱者
* @author root
*
*/
public class AppConsumer {
private static final String url="tcp://127.0.0.1:61616";//埠預設
private static final String topicName="topic-test";//要消費的訊息名稱
public static void main(String[] args) throws JMSException {
//1.建立ConnectiongFactory,繫結地址
ConnectionFactory factory=new ActiveMQConnectionFactory(url);
//2.建立Connection
Connection connection= factory.createConnection();
//3.啟動連線
connection.start();
//4.建立會話
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.建立一個目標
Destination destination=session.createTopic(topicName);
//6.建立一個消費者
MessageConsumer consumer=session.createConsumer(destination);
//7.建立一個監聽器
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
TextMessage textMessage=(TextMessage)arg0;
try {
System.out.println("接收訊息:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
執行生產者,再服務網頁上可以看到,生產100條訊息
Name ↑ Number Of Consumers Messages Enqueued Messages Dequeued Operations
topic-test 0 100 0 Send To Active Subscribers
Active Producers
Delete
但是這時執行訂閱者並未收到訊息。因為剛才的訊息是訂閱者訂閱之前產生的,就不能接受了。類似公眾號訂閱,訂閱後的訊息可以接受,但是訂閱之前的訊息就收不到了。如果訂閱後有訊息產生,那麼就可以正常接受。
這時候再用生產者傳送100條資訊。可以看到訊息總數200
Name ↑ Number Of Consumers Messages Enqueued
topic-test 1 200 100
而此時訂閱者也接收到了新產生的100條訊息
接收訊息:哈哈哈哈哈:0
接收訊息:哈哈哈哈哈:1
接收訊息:哈哈哈哈哈:2
接收訊息:哈哈哈哈哈:3
接收訊息:哈哈哈哈哈:4
接收訊息:哈哈哈哈哈:5
接收訊息:哈哈哈哈哈:6
接收訊息:哈哈哈哈哈:7
接收訊息:哈哈哈哈哈:8
接收訊息:哈哈哈哈哈:9
接收訊息:哈哈哈哈哈:10
接收訊息:哈哈哈哈哈:11
接收訊息:哈哈哈哈哈:12
接收訊息:哈哈哈哈哈:13
接收訊息:哈哈哈哈哈:14
接收訊息:哈哈哈哈哈:15
接收訊息:哈哈哈哈哈:16
接收訊息:哈哈哈哈哈:17
接收訊息:哈哈哈哈哈:18
接收訊息:哈哈哈哈哈:19
接收訊息:哈哈哈哈哈:20
接收訊息:哈哈哈哈哈:21
接收訊息:哈哈哈哈哈:22
接收訊息:哈哈哈哈哈:23
接收訊息:哈哈哈哈哈:24
接收訊息:哈哈哈哈哈:25
接收訊息:哈哈哈哈哈:26
接收訊息:哈哈哈哈哈:27
接收訊息:哈哈哈哈哈:28
接收訊息:哈哈哈哈哈:29
接收訊息:哈哈哈哈哈:30
接收訊息:哈哈哈哈哈:31
接收訊息:哈哈哈哈哈:32
接收訊息:哈哈哈哈哈:33
接收訊息:哈哈哈哈哈:34
接收訊息:哈哈哈哈哈:35
接收訊息:哈哈哈哈哈:36
接收訊息:哈哈哈哈哈:37
接收訊息:哈哈哈哈哈:38
接收訊息:哈哈哈哈哈:39
接收訊息:哈哈哈哈哈:40
接收訊息:哈哈哈哈哈:41
接收訊息:哈哈哈哈哈:42
接收訊息:哈哈哈哈哈:43
接收訊息:哈哈哈哈哈:44
接收訊息:哈哈哈哈哈:45
接收訊息:哈哈哈哈哈:46
接收訊息:哈哈哈哈哈:47
接收訊息:哈哈哈哈哈:48
接收訊息:哈哈哈哈哈:49
接收訊息:哈哈哈哈哈:50
接收訊息:哈哈哈哈哈:51
接收訊息:哈哈哈哈哈:52
接收訊息:哈哈哈哈哈:53
接收訊息:哈哈哈哈哈:54
接收訊息:哈哈哈哈哈:55
接收訊息:哈哈哈哈哈:56
接收訊息:哈哈哈哈哈:57
接收訊息:哈哈哈哈哈:58
接收訊息:哈哈哈哈哈:59
接收訊息:哈哈哈哈哈:60
接收訊息:哈哈哈哈哈:61
接收訊息:哈哈哈哈哈:62
接收訊息:哈哈哈哈哈:63
接收訊息:哈哈哈哈哈:64
接收訊息:哈哈哈哈哈:65
接收訊息:哈哈哈哈哈:66
接收訊息:哈哈哈哈哈:67
接收訊息:哈哈哈哈哈:68
接收訊息:哈哈哈哈哈:69
接收訊息:哈哈哈哈哈:70
接收訊息:哈哈哈哈哈:71
接收訊息:哈哈哈哈哈:72
接收訊息:哈哈哈哈哈:73
接收訊息:哈哈哈哈哈:74
接收訊息:哈哈哈哈哈:75
接收訊息:哈哈哈哈哈:76
接收訊息:哈哈哈哈哈:77
接收訊息:哈哈哈哈哈:78
接收訊息:哈哈哈哈哈:79
接收訊息:哈哈哈哈哈:80
接收訊息:哈哈哈哈哈:81
接收訊息:哈哈哈哈哈:82
接收訊息:哈哈哈哈哈:83
接收訊息:哈哈哈哈哈:84
接收訊息:哈哈哈哈哈:85
接收訊息:哈哈哈哈哈:86
接收訊息:哈哈哈哈哈:87
接收訊息:哈哈哈哈哈:88
接收訊息:哈哈哈哈哈:89
接收訊息:哈哈哈哈哈:90
接收訊息:哈哈哈哈哈:91
接收訊息:哈哈哈哈哈:92
接收訊息:哈哈哈哈哈:93
接收訊息:哈哈哈哈哈:94
接收訊息:哈哈哈哈哈:95
接收訊息:哈哈哈哈哈:96
接收訊息:哈哈哈哈哈:97
接收訊息:哈哈哈哈哈:98
接收訊息:哈哈哈哈哈:99
這時候我們多啟動幾個訂閱者。這時候連線增加了,
Name Remote Address Active Slow
ID:localhost.localdomain-47511-1513825521558-0:1 tcp://127.0.0.1:44132 true false
ID:localhost.localdomain-45365-1513825526379-0:1 tcp://127.0.0.1:44133 true false
ID:localhost.localdomain-47703-1513825117371-0:1 tcp://127.0.0.1:44125 true false
ID:localhost.localdomain-51411-1513823735949-0:1 tcp://127.0.0.1:43751 true false
ID:localhost.localdomain-55828-1513824112837-0:1 tcp://127.0.0.1:43753 true false
ID:localhost.localdomain-36330-1513823606217-0:1 tcp://127.0.0.1:43748 true false
再次啟動生產者啟動訊息 100條,
這時候新增加的幾個訂閱者,和之前原有的訂閱者都收到了100條訊息。
總結:主題模式的訂閱者只有再訂閱之後才能接收訊息,而訂閱之前的訊息是不能接收到的。而且訂閱者接收的訊息是完整接收的。不論訂閱者多少,每個人接收到的訊息是一樣的。