ミドルウェアactiveMQの使用と紹介
ミドルウェア:ミドルウェアは独立したシステムソフトウェアまたはサービスプログラムであり、分散アプリケーションソフトウェアはこのソフトウェアを利用して異なる技術間でリソースを共有します.ミドルウェアは、クライアント/サーバのオペレーティングシステムの上にあり、コンピュータリソースとネットワーク通信を管理します.は、2つの独立したアプリケーションまたは独立したシステムを接続するソフトウェアです.接続されたシステムは、異なるインタフェースを有していても、ミドルウェアによって互いに情報を交換することができる.ミドルウェアを実行する重要な方法の1つは、情報伝達です.ミドルウェアを使用すると、アプリケーションはマルチプラットフォームまたはOS環境で動作します.
JAvaにはIBM MQ、JMS、もうすぐ話すactiveMQなど、ミドルウェアがたくさんあります.
なぜミドルウェアを使うのか、ミドルウェアを使うメリットは言わない.
apache公式サイトに最新バージョンのactiveMQをダウンロードするのはapache-activemq-5.9です.0.
1つのディレクトリに解凍し、ネイティブ用であれば、基本的に構成は必要ありません.構成すれば、confの下で構成すればいいです.具体的にはapache公式説明を参照してください.
binの下のactivemqを起動します.bat.例を見たいなら、webapps-demoの下のdemoをwebappsの下にコピーすればいいです.
Activemqはjetty容器を内蔵しjetty.xml内には、次のノードがあります.
tomcatに詳しい人は、これが対外アクセスのポートであることを知っているはずですよ.localhost:8161でjettyコンテナにアクセスできます.ブラウザが入力すると、ページが表示されます.jettyだと信じない場合は、8161後に任意のパスを入力して、次のように戻ることができます.
webappsディレクトリの下にadminがあり、その名の通りjettyを管理しているのでしょう、tomcatのmanagerと同じでしょう.ほかは言わない.
binの下のactivemqを起動します.bat.
activemqを表示します.xml、このファイルには次のノードがあります.
だからmqにアクセスしたいなら、いろいろな方法がありますね.
最もよく使われるのはもちろんtcpプロトコルです.
Activemqの管理ページはHome|Queues|Topics|Subscribers|Connections|Network|Scheduled|Send
ドキュメントを見ると、メッセージ転送には2つのモデル、queue、topicがあることがわかります.
queue:
メッセージ生産者生産メッセージはqueueに送信され、メッセージ消費者はqueueからメッセージを取り出し、消費する.しかし、メッセージが消費されるとqueueには格納されないため、メッセージ消費者が消費されたメッセージを消費することはできない.Queueは複数の消費者が存在することをサポートしているが、1つのメッセージについては1人の消費者しか消費できない.
topic:
メッセージ生産者は、メッセージをtopicに公開するとともに、複数のメッセージ消費者がメッセージを消費する.queueとは異なり、topicに公開されたメッセージはすべての購読者に消費されます.
以上の各特徴は実際のコードで検証できます.
次に、コード領域テストテストを書きます.
送信:
承認:
ユーザー名とパスワードはadminで、知らない場合はActiveMQConnectionを使います.DEFAULT_USERとActiveMQConnection.DEFAULT_PASWORDで代用しましょう.
自分で運転してみましょう.
次にtopicを示します.
送信:
受信者:
違いは赤い線で表記されているので、受信者(複数run数回)を実行してから送信者を実行します.コンソールを切り替えてみましょう.
コンソールを切り替えると見えます.queue方式で送信されたメッセージがある受信者に受信されると,他の受信者は受信できなくなる.一方、topic方式では、送信者のメッセージはすべての受信者に受信される.
はい、多分これだけ紹介しましょう.
ActivemqとIBM MQのメカニズムはそれほど悪くないが,IBM MQはactiveMqよりずっと複雑である.
一部のプロジェクト、特に銀行プロジェクトは中間部品が多い.
JAvaにはIBM MQ、JMS、もうすぐ話すactiveMQなど、ミドルウェアがたくさんあります.
なぜミドルウェアを使うのか、ミドルウェアを使うメリットは言わない.
apache公式サイトに最新バージョンのactiveMQをダウンロードするのはapache-activemq-5.9です.0.
1つのディレクトリに解凍し、ネイティブ用であれば、基本的に構成は必要ありません.構成すれば、confの下で構成すればいいです.具体的にはapache公式説明を参照してください.
binの下のactivemqを起動します.bat.例を見たいなら、webapps-demoの下のdemoをwebappsの下にコピーすればいいです.
Activemqはjetty容器を内蔵しjetty.xml内には、次のノードがあります.
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="port" value="8161"/>
</bean>
tomcatに詳しい人は、これが対外アクセスのポートであることを知っているはずですよ.localhost:8161でjettyコンテナにアクセスできます.ブラウザが入力すると、ページが表示されます.jettyだと信じない場合は、8161後に任意のパスを入力して、次のように戻ることができます.
Problem accessing /ddd. Reason:
Not Found
Powered by Jetty://
webappsディレクトリの下にadminがあり、その名の通りjettyを管理しているのでしょう、tomcatのmanagerと同じでしょう.ほかは言わない.
binの下のactivemqを起動します.bat.
activemqを表示します.xml、このファイルには次のノードがあります.
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
だからmqにアクセスしたいなら、いろいろな方法がありますね.
最もよく使われるのはもちろんtcpプロトコルです.
Activemqの管理ページはHome|Queues|Topics|Subscribers|Connections|Network|Scheduled|Send
ドキュメントを見ると、メッセージ転送には2つのモデル、queue、topicがあることがわかります.
queue:
メッセージ生産者生産メッセージはqueueに送信され、メッセージ消費者はqueueからメッセージを取り出し、消費する.しかし、メッセージが消費されるとqueueには格納されないため、メッセージ消費者が消費されたメッセージを消費することはできない.Queueは複数の消費者が存在することをサポートしているが、1つのメッセージについては1人の消費者しか消費できない.
topic:
メッセージ生産者は、メッセージをtopicに公開するとともに、複数のメッセージ消費者がメッセージを消費する.queueとは異なり、topicに公開されたメッセージはすべての購読者に消費されます.
以上の各特徴は実際のコードで検証できます.
次に、コード領域テストテストを書きます.
送信:
package com.mq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Destination destination;
MessageProducer producer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,// admin,admin
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("testQueue");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 0; i < 5; i++) {
TextMessage message = session.createTextMessage(" " + i);
producer.send(message);
}
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
承認:
package com.mq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Destination destination;
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,// admin,admin
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("testQueue");
consumer = session.createConsumer(destination);
while (true) {
TextMessage message = (TextMessage) consumer.receive(100000);
if (null != message) {
System.out.println(" " + message.getText());
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
ユーザー名とパスワードはadminで、知らない場合はActiveMQConnectionを使います.DEFAULT_USERとActiveMQConnection.DEFAULT_PASWORDで代用しましょう.
自分で運転してみましょう.
次にtopicを示します.
送信:
package com.mq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Topic destination;
MessageProducer producer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,// admin,admin
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("testTopic");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 0; i < 5; i++) {
TextMessage message = session.createTextMessage(" " + i);
producer.send(message);
}
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
受信者:
package com.mq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Topic destination;
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,// admin,admin
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("testTopic");
consumer = session.createConsumer(destination);
while (true) {
TextMessage message = (TextMessage) consumer.receive();
if (null != message) {
System.out.println(" " + message.getText());
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
違いは赤い線で表記されているので、受信者(複数run数回)を実行してから送信者を実行します.コンソールを切り替えてみましょう.
コンソールを切り替えると見えます.queue方式で送信されたメッセージがある受信者に受信されると,他の受信者は受信できなくなる.一方、topic方式では、送信者のメッセージはすべての受信者に受信される.
はい、多分これだけ紹介しましょう.
ActivemqとIBM MQのメカニズムはそれほど悪くないが,IBM MQはactiveMqよりずっと複雑である.
一部のプロジェクト、特に銀行プロジェクトは中間部品が多い.