永続的(永続)
- messageProducer.setDeliverMode(DeliverMode.NON_PERSISTENT);非永続:サーバがダウンしている場合、メッセージが存在しません
- messgageProducer.setDeliveryMode(はDeliveryMode.PERSISTENT);永続性:サーバがダウンしている、メッセージ残ります。
キュー(待ち行列)持続:
デフォルトのキューは、これらのメッセージは一度だけ送信され、正常に一度使用されていることを確認永続的なモードです。これらのメッセージについては、信頼性がプライム考慮事項です。
もう一つの重要な側面は、消費者にそれらを送信する前にメッセージサービスがメッセージを失わない、ターゲットに永続的なメッセージの信頼性を確保することです。
テーマ(トピック)持続:
消費者コード:
package pres.zhang.persistent;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
public class Topic_Consumer {
public static final String ACTIVEMQ_URL = "tcp://localhost:61616";
public static final String TOPIC_NAME = "topic_acton";
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.通过连接工厂,获得连接connection,并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
//connection.start();
//设置订阅用户
connection.setClientID("test");
//3.创建回话session
//两个参数 1.事务 2.签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.创建目的地(具体是队列还是主题topic)
Topic topic = session.createTopic(TOPIC_NAME);
//创建持久化的订阅 参数:1.主题 2.备注
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remard");
//发布订阅
connection.start();
Message message = topicSubscriber.receive();
while (null != message){
TextMessage textMessage = (TextMessage) message;
System.out.println("收到的持久化topic:" + ((TextMessage) message).getText());
//继续监听
message = topicSubscriber.receive(1000L);
}
session.close();
connection.close();
}
}
生産者コード:
package pres.zhang.persistent;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Topic_Produce {
public static final String ACTIVEMQ_URL = "tcp://localhost:61616";
public static final String TOPIC_NAME = "topic_acton";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.通过连接工厂,获得连接connection,并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
//connection.start();
//3.创建回话session
//两个参数 1.事务 2.签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.创建目的地(具体是队列还是主题topic)
Topic topic = session.createTopic(TOPIC_NAME);
//创建消息的生产者
MessageProducer messageProducer = session.createProducer(topic);
//通过使用messageProducer生产3条消息发送到MQ的队列里面
//设置持久化主题
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
//因为设置持久化主题,所以connect.start()在这里调用
connection.start();
for (int i = 0; i < 3; i++) {
//7.创建消息
TextMessage textMessage = session.createTextMessage("TOPIC_NAME---" + i);//可以理解为字符串
//8.通过messageProducer发送给MQ
messageProducer.send(textMessage);
}
//9.关闭资源
messageProducer.close();
session.close();
connection.close();;
System.out.println("消息发布到TOPIC完成!");
}
}
テスト:消費者側、テーマ別のサブスクリプションを実行します
個人消費へのメッセージがないので、ディスプレイは、アクティブな加入者を持っているので、プログラムは、リスニングとなっています。:私たちは、プログラムを終了し、変更内容は以下のようにしている
私たちのプログラムが終了しているため、オフラインフィールドに表示されるように、私たちが正常に加入しています。
今すぐニュースのプロデューサーを実行します。
メッセージが正常に送信しました。私たちは、消費者を再度実行します。
コンソールを印刷します:
收到的持久化topic:TOPIC_NAME---0
收到的持久化topic:TOPIC_NAME---1
收到的持久化topic:TOPIC_NAME---2
私たちがトピックにサブスクライブしているために成功し、メッセージを受信しました。
要約:
- まず、消費者を実行し、我々は、このトピックにサブスクライブするものに似MQ、に登録するために等しくなければなりません。
- メッセージプロデューサは、実行を送信します
- この時点で、かどうかに関係なく、消費者のオンライン、そして、オンラインでない、受信次回に接続します、私はメッセージがダウンして受信し、受信したことはありません。