ホームページ  >  記事  >  Java  >  ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります

ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります

php是最好的语言
php是最好的语言オリジナル
2018-08-03 14:34:172391ブラウズ

Tomcat に埋め込まれた ActiveMQ

一部のプロジェクトでは、ActiveMQ を個別に開くのは、プロジェクトの実装が少し面倒な場合があります。そこで、Tomcat に ActiveMQ を埋め込み、Tomcat の起動と同時に ActiveMQ も起動します。これから、3 つの重要な知識ポイントをマスターする必要があります
  • ActiveMQ の BrokerService

  • 自己起動サーブレットの構成

  • jconsole を使用して組み込み ActiveMQ の実行ステータスを理解する

1 BrokerService をオンにします

ActiveMQ 依存関係を pom.xml に追加します。このコード例ではバージョン 5.7 を使用します。

activemq-core のみが必要であることに注意してください。

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.7.0</version>
</dependency>
activemq-core就行

    // author:herbert qq:464884492
    BrokerService broker = new BrokerService();
    broker.setUseJmx(true); // 开启监控
    broker.setPersistent(true); // 持久化
    broker.setBrokerName("Test");
    SimpleAuthenticationPlugin sap = new SimpleAuthenticationPlugin();
    AuthenticationUser au = new AuthenticationUser("admin", "admin","users");
    ArrayList<AuthenticationUser> d = new ArrayList<AuthenticationUser>();
    d.add(au);
    sap.setUsers(d); // 用户验证
    broker.setPlugins(new BrokerPlugin[] { sap });
    String mqDataPath = "/activemq"; // 存储位置 
    broker.getPersistenceAdapter().setDirectory(new File(mqDataPath));
    broker.addConnector("tcp://localhost:61616"); // 连接地址
    broker.start();

在编写BrokerService代码部分,主要注意三个点

  1. 是否需要在jconsole中显示监控信息 broker.setUseJmx(true)

  2. 设置连接用户名和密码,如何使用验证插件

  3. 是否持久化,存储位置设置,持久化配置

所以需要启动一个连接地址 tcp://localhost:61616,用户名为admin,密码为admin,需要持久化,持久化数据文件存储地址为 /activemq ,需要启动jconsole监控的BrokerService的代码如下:

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageProducer messageProducer = session.createProducer(destination);

for (int i = 0; i < 10; i++) {
 javax.jms.TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
 System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i);
 messageProducer.send(message);
}

二、生产者和消费者

ActiveMQ中,通用的消息传递方式有两种

  • 队列,支持消息持久化,未消费的消息,在重启后依然存在。若有多个消费者,在每次提取一条消息的前提下,所有消费均分队列中的消息

  • 主题,不支持消息持久化,未消费的消息,在重启后消息丢失。若有多个消费,每个消费者依次消费主题中所有消息

不管是生产者还是消费者代码编写,主要是4个步骤

  1. 建立连接,采用failover:()方式,自动断线重连

  2. 建立Session,获取发送或接收目标Destination ,指定是队列(session.createQueue(queueName)),还是主题(session.createTopic(topicName))

  3. 通过Session获取生产者或消费者

  4. 生产或消费消息

我们现在编写一个生产者的代码,并循环产生10条消息

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageConsumer messageConsumer = session.createConsumer(destination);
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(javax.jms.Message message) {
   ActiveMQTextMessage m = (ActiveMQTextMessage) message;
    try {
          System.out.println("接收到:" + m.getText());
         } catch (JMSException e) {
         e.printStackTrace();
        }
     }
});

编写一个消费,消费上边的10条消息

 // author:herbert qq:464884492
@WebServlet(urlPatterns = "/initmq", loadOnStartup = 1)
public class InitMqServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 这里编写启动ActiveMQ代码
 }
}

运行效果

ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります

可见,我们生产者,产生的10条消息,已成功被消费者处理了。

三、监控嵌入的ActiveMQ

对于嵌入的ActiveMQ,在BrokerService启动前需要设置 broker.setUseJmx(true);然后找到你的JAVA_HOME,切换到bin,输入jconsole命令。

ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります

待jconsole启动后,选择ActiveMQ所在的进程。连接后选择Mbean页签

ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります

红框的地方分别为已消费和已进入MQ中的消息的条数。选择操作,找到那个SendTextMessage还可以想此队列发送消息。

四、Selvelt跟随Tomcat启动

对于Tomcat7.x版本之后Tomcat,Selvelt都可以通过直接在代码中通过注解的方式配置URl连接,一起是否自启动loadOnStartup 这个值>=0表示需要自启动,值越小优先级越高

rrreee

五、总结

这次以ActiveMQ作为消息队列使用切入点,总体上说还比较顺利。其中唯一出现问题的地方就是对于activeMQ依赖过多,多依赖了jaractivemq-broker,导致消息能连接,但不能发送消息。后边直接换成 activemq-all,有出现slf4j日志冲突,使用exclusions依然不能解决问题。最终只依赖 activemq-core BrokerService のコード部分を記述するときは、3 つの主要な点に注意してください

    jconsole でモニタリングを表示する必要がありますか? 情報 broker.setUseJmx(true)


    接続ユーザー名とパスワードの設定、検証プラグインの使用方法

    永続的かどうか、保存場所の設定、永続化構成

したがって、接続アドレス tcp://localhost:61616、ユーザー名は admin、パスワードは admin であり、永続化が必要です。データ ファイルの格納アドレスは /activemq です。 jconsole 監視によって開始する必要がある BrokerService のコードは次のとおりです。 🎜rrreee🎜 2. プロデューサとコンシューマ 🎜🎜 ActiveMQ の共通メッセージ 2 つの配信方法があります 🎜🎜🎜🎜 メッセージの永続化をサポートするキュー。未消費のメッセージは再起動後も残ります。複数のコンシューマが存在する場合、一度に 1 つのメッセージを抽出することを前提として、すべてのコンシューマがキュー内のメッセージを均等に共有します。メッセージの永続化はサポートされていないため、再起動後に未消費のメッセージは失われます。複数のコンシューマが存在する場合、各コンシューマはトピック内のすべてのメッセージを順番に消費します🎜🎜🎜🎜プロデューサ コードによって書かれたかコンシューマ コードによって書かれたかに関係なく、主に 🎜 4 のステップがあります🎜
    🎜🎜接続を確立し、failover:() メソッドを使用し、自動的に切断して再接続します🎜🎜🎜🎜セッションを確立し、送信または受信ターゲット Destination では、それがキュー (session.createQueue(queueName)) であるかトピック (session.createTopic(topicName)) であるかを指定します。 🎜🎜🎜🎜 Session を通じてプロデューサーまたはコンシューマーを取得します🎜🎜🎜🎜メッセージを生成または消費します🎜🎜
🎜 次に、プロデューサー コードを作成し、10 個のメッセージを生成するループを作成します🎜rrreee🎜 コンシューマーを作成します上記 10 個のメッセージを消費するには 🎜rrreee🎜操作効果🎜🎜 ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります🎜🎜プロデューサーによって生成された 10 個のメッセージがコンシューマーによって正常に処理されたことがわかります。 🎜🎜3. 組み込み ActiveMQ を監視する🎜🎜 組み込み ActiveMQ の場合は、BrokerService を開始する前に Broker.setUseJmx(true) を設定し、JAVA_HOME を見つけて bin に切り替え、jconsole コマンドを入力する必要があります。 🎜🎜ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります🎜🎜 jconsole が起動したら、ActiveMQ が存在するプロセスを選択します。接続後、Mbean タブを選択します🎜🎜1 .png🎜🎜赤いボックスは、それぞれ消費されたメッセージと MQ に入ったメッセージの数を表します。操作を選択し、SendTextMessage を見つけると、このキューにメッセージを送信することもできます。 🎜🎜4. Tomcat と Selvelt のバージョンが Tomcat に続いて起動します🎜🎜 =0 は、値が小さいほど優先度が高くなります。🎜🎜 今回は ActiveMQ です。メッセージ キューの使用のエントリ ポイントとして使用されるため、一般的には比較的スムーズです。唯一の問題は、activeMQ に依存しすぎ、jar activemq-broker に依存しすぎるため、メッセージは接続できても送信されないことです。その後、activemq-all に直接変更しましたが、exclusions を使用しても問題は解決できませんでした。結局、 activemq-core に依存するだけで、すべての問題が完全に解決されました。 🎜🎜関連記事: 🎜🎜関連記事: 🎜🎜🎜🎜JMS メッセージの永続化、mySql データベースへの ActiveMQ メッセージの永続化🎜🎜🎜🎜ActiveMQ のセッション設定の関連理解🎜🎜

以上がActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。