ActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要があります
Tomcat に埋め込まれた ActiveMQ
一部のプロジェクトでは、ActiveMQ を個別に開くのは、プロジェクトの実装が少し面倒な場合があります。そこで、Tomcat に ActiveMQ を埋め込み、Tomcat の起動と同時に ActiveMQ も起動します。これから、3 つの重要な知識ポイントをマスターする必要があります
ActiveMQ の BrokerService
自己起動サーブレットの構成
jconsole を使用して組み込み ActiveMQ の実行ステータスを理解する
。
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
代码部分,主要注意三个点
是否需要在
jconsole
中显示监控信息broker.setUseJmx(true)
设置连接用户名和密码,如何使用验证插件
是否持久化,存储位置设置,持久化配置
所以需要启动一个连接地址 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个步骤
建立连接,采用
failover:()
方式,自动断线重连建立
Session
,获取发送或接收目标Destination
,指定是队列(session.createQueue(queueName)
),还是主题(session.createTopic(topicName)
)通过
Session
获取生产者或消费者生产或消费消息
我们现在编写一个生产者的代码,并循环产生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代码 } }
运行效果
可见,我们生产者,产生的10条消息,已成功被消费者处理了。
三、监控嵌入的ActiveMQ
对于嵌入的ActiveMQ,在BrokerService启动前需要设置 broker.setUseJmx(true);然后找到你的JAVA_HOME,切换到bin,输入jconsole命令。
待jconsole启动后,选择ActiveMQ所在的进程。连接后选择Mbean页签
红框的地方分别为已消费和已进入MQ中的消息的条数。选择操作,找到那个SendTextMessage还可以想此队列发送消息。
四、Selvelt跟随Tomcat启动
对于Tomcat7.x版本之后Tomcat,Selvelt都可以通过直接在代码中通过注解的方式配置URl连接,一起是否自启动loadOnStartup
这个值>=0表示需要自启动,值越小优先级越高
五、总结
这次以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
を通じてプロデューサーまたはコンシューマーを取得します🎜🎜🎜🎜メッセージを生成または消費します🎜🎜


activemq-broker
に依存しすぎるため、メッセージは接続できても送信されないことです。その後、activemq-all
に直接変更しましたが、exclusions
を使用しても問題は解決できませんでした。結局、 activemq-core
に依存するだけで、すべての問題が完全に解決されました。 🎜🎜関連記事: 🎜🎜関連記事: 🎜🎜🎜🎜JMS メッセージの永続化、mySql データベースへの ActiveMQ メッセージの永続化🎜🎜🎜🎜ActiveMQ のセッション設定の関連理解🎜🎜以上がActiveMQ を Tomcat に組み込む: 3 つの重要な知識ポイントを習得する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
