ActiveMQ 嵌入Tomcat
2018-08-03 07:30:35来源:博客园 阅读 ()
在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐。所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ。由此我们需要掌握三个个重要的知识点
- ActiveMQ中的BrokerService
- 自启动Servlet配置
- 使用jconsole了解嵌入ActiveMQ运行状态
一、开启BrokerService
在pom.xml添加ActiveMQ依赖,本次代码实例采用5.7版本,记住只需要activemq-core
就行。
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.7.0</version> </dependency>
在编写BrokerService
代码部分,主要注意三个点
- 是否需要在
jconsole
中显示监控信息broker.setUseJmx(true)
- 设置连接用户名和密码,如何使用验证插件
- 是否持久化,存储位置设置,持久化配置
所以需要启动一个连接地址 tcp://localhost:61616
,用户名为admin
,密码为admin
,需要持久化,持久化数据文件存储地址为 /activemq
,需要启动jconsole
监控的BrokerService的代码如下:
1 // author:herbert qq:464884492 2 BrokerService broker = new BrokerService(); 3 broker.setUseJmx(true); // 开启监控 4 broker.setPersistent(true); // 持久化 5 broker.setBrokerName("Test"); 6 SimpleAuthenticationPlugin sap = new SimpleAuthenticationPlugin(); 7 AuthenticationUser au = new AuthenticationUser("admin", "admin","users"); 8 ArrayList<AuthenticationUser> d = new ArrayList<AuthenticationUser>(); 9 d.add(au); 10 sap.setUsers(d); // 用户验证 11 broker.setPlugins(new BrokerPlugin[] { sap }); 12 String mqDataPath = "/activemq"; // 存储位置 13 broker.getPersistenceAdapter().setDirectory(new File(mqDataPath)); 14 broker.addConnector("tcp://localhost:61616"); // 连接地址 15 broker.start();
二、生产者和消费者
ActiveMQ中,通用的消息传递方式有两种
- 队列,支持消息持久化,未消费的消息,在重启后依然存在。若有多个消费者,在每次提取一条消息的前提下,所有消费均分队列中的消息
- 主题,不支持消息持久化,未消费的消息,在重启后消息丢失。若有多个消费,每个消费者依次消费主题中所有消息
不管是生产者还是消费者代码编写,主要是4个步骤
- 建立连接,采用
failover:()
方式,自动断线重连 - 建立
Session
,获取发送或接收目标Destination
,指定是队列(session.createQueue(queueName)
),还是主题(session.createTopic(topicName)
) - 通过
Session
获取生产者或消费者 - 生产或消费消息
我们现在编写一个生产者的代码,并循环产生10条消息
1 // author:herbert qq:464884492 2 String mqConnUrl = "tcp://localhost:61616"; 3 String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000"; 4 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin", connUrl); 5 javax.jms.Connection connection = connectionFactory.createConnection(); 6 connection.start(); 7 Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); 8 Destination destination = session.createQueue("system"); 9 MessageProducer messageProducer = session.createProducer(destination); 10 11 for (int i = 0; i < 10; i++) { 12 javax.jms.TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i); 13 System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i); 14 messageProducer.send(message); 15 }
编写一个消费,消费上边的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条消息,已成功被消费者处理了。
三、监控嵌入的ActiveMQ
对于嵌入的ActiveMQ,在BrokerService启动前需要设置 broker.setUseJmx(true);然后找到你的JAVA_HOME,切换到bin,输入jconsole命令。
待jconsole启动后,选择ActiveMQ所在的进程。连接后选择Mbean页签
红框的地方分别为已消费和已进入MQ中的消息的条数。选择操作,找到那个SendTextMessage还可以想此队列发送消息。
四、Selvelt跟随Tomcat启动
对于Tomcat7.x版本之后Tomcat,Selvelt都可以通过直接在代码中通过注解的方式配置URl连接,一起是否自启动loadOnStartup
这个值>=0表示需要自启动,值越小优先级越高
1 // author:herbert qq:464884492 2 @WebServlet(urlPatterns = "/initmq", loadOnStartup = 1) 3 public class InitMqServlet extends HttpServlet { 4 @Override 5 public void init(ServletConfig config) throws ServletException { 6 super.init(config); 7 // 这里编写启动ActiveMQ代码 8 } 9 }
五、总结
这次以ActiveMQ作为消息队列使用切入点,总体上说还比较顺利。其中唯一出现问题的地方就是对于activeMQ依赖过多,多依赖了jaractivemq-broker
,导致消息能连接,但不能发送消息。后边直接换成 activemq-all
,有出现slf4j日志冲突,使用exclusions
依然不能解决问题。最终只依赖 activemq-core
,完美解决所有问题。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
- Idea实现SpringBoot外置Tomcat的Web项目热部署(包含静态文 2020-06-04
- 【报错】导入项目后报错:Target runtime Apache Tomcat v7. 2020-05-25
- 解决windows下tomcat端口被占用最简单暴力方法 2020-05-25
- Tomcat安装 2020-05-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash