メッセージングミドルウェアのI.概要
メッセージミドルウェアとは何ですか
发送者将消息发送给消息服务器,消息服务器将消感存放在若千队列中,在合适的时候再将消息转发给接收者。
这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信: 对于一个消息可以有多个接收者。
二、JMSの紹介
2.1 JMSとは何ですか?
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
2.2メッセージモデル
- P2P(ポイントツーポイント):
1.P2P略図
特性の概念に関連する前記
1メッセージ待ち行列(キュー)
2.送信者(送信者)
3.受信機(受信機)
各メッセージが送信される4特定のキューは、受信側はキューからメッセージを取得します。それは彼らが消費またはタイムアウトするまで、メッセージキューを保持します。
特長:
1.各メッセージには一つだけのコンシューマ(消費者)(すなわち、消費者と、それはメッセージキュー内のメッセージはもはやありません)があり
、送信側と受信機2の間の時間には依存性が、それは時に伝送言うことですメッセージが送信された後、受信者が何のランニングを持っていないかどうか、それは、メッセージがキューに送信された影響はありません
。3.受信者の受信成功の成功後にメッセージキューに返信する必要があります - パブ/サブ(パブリッシュおよびサブスクライブ)
パブ/サブモードマップ
どの概念と機能が含ま
1.テーマ(トピック)
2.出版(出版社)
3.加入者(加入者)
のトピックにメッセージを送信するクライアントを。より多くの出版社がトピックにメッセージを送信すると、システムは、複数の加入者にこれらのメッセージをお届けします。
パブ/サブ特性
1.各メッセージには、複数の消費者が持つことができる
2つのパブリッシャとサブスクライバ間の時間に依存しています。テーマ(トピック)の加入者のためにした後、それが消費者に、出版社のメッセージを加入者を作成しなければならない、とのメッセージを消費するために、加入者は、実行中の状態を維持しなければなりません。
- 消費者の双方向のメッセージ
- 同期
サブスクリプションまたは受信者は、メッセージを受信したメッセージを受信することができます(またはタイムアウトが前に)ブロックされたままになる前に、メソッドを受信する受信メソッドを呼び出します。
2.非同期
の加入者または受信者がメッセージリスナとして登録することができます。メッセージが到着すると、システムが自動的にonMessageメソッドリスナーを呼び出します。
シナリオ:
ユーザ登録、受注在庫を修正し、ログ保存
ActiveMQのは、使用されています
窓のActiveMQインストールの下で
現在のActiveMQを抽出すると、
binディレクトリにある64ビットシステムで起動入力する
ページに成功した訪問を開始するには:
ActiveMQのは、ピア(P2P)通信モードを使用して完了する
ファイルの依存関係の導入ポンポン
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
</dependencies>
プロデューサーコード
public static void main(String[] args) throws JMSException {
//连接工厂JMS 用它创建连接
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start();
// Session: 一个发送或接收消息的线程
Session session = createConnection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// Destination :消息的目的地;消息发送给谁.
// 获取session注意参数值xiaobai是Query的名字
Destination destination = session.createQueue("xiaobai");
//MessageProducer:消息生产者
MessageProducer producer = session.createProducer(destination);
//设置持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 5; i++) {
System.out.println("我是生产者" + i);
sendMsg(session, producer, "我是生产者" + i);
session.commit();
}
System.out.println("我是生产者发送完毕" );
}
public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq" + i);
producer.send(textMessage);
}
コンシューマーコード:
//连接工厂,JMS 用它创建连接
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start();
//Session: 一个发送或接收消息的线程
Session session = createConnection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("xiaobai");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage != null) {
String text = textMessage.getText();
System.out.println(text);
// textMessage.acknowledge();
session.commit();
} else {
break;
}
System.out.println("消费者消费完毕");
}
プロデューサーは、メッセージデータの途中で見始めた
消費量を表示するには、消費者を開始します
パブリッシュおよびサブスクライブ
メーカーコード:
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start();
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(null);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 0; i < 5; i++) {
System.out.println("我是生产者" + i);
sendMsg(session, producer, "我是生产者" + i);
}
System.out.println("我是生产者发送完毕" );
}
public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq" + i);
Destination destination = session.createTopic("xiao_topic");
producer.send(destination,textMessage);
}
消費者コード
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start();
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic("xiao_topic");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage != null) {
String text = textMessage.getText();
System.out.println(text);
} else {
break;
}
System.out.println("消费者消费完毕");
}
}
消費者は、最初に生産を開始した後、起動します