集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ。
1.web项目中Broker启动的方式进行集成
在这里采用Listener监听ServletContext创建和销毁进行Broker的启动和销毁。
0.需要的jar包:
1.listener实现ServletContextListener接口
package cn.qlq.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.activemq.broker.BrokerService; public class ActiveMQListener implements ServletContextListener { private static final BrokerService brokerService = new BrokerService(); @Override public void contextDestroyed(ServletContextEvent arg0) { try { brokerService.stop(); System.out.println("broker 停止"); } catch (Exception e) { } } @Override public void contextInitialized(ServletContextEvent arg0) { try { brokerService.setUseJmx(true); brokerService.addConnector("tcp://localhost:61616"); brokerService.start(); System.out.println("broker 启动"); } catch (Exception e) { e.printStackTrace(); } } }
web.xml进行监听器的配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>MyWeb</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>cn.qlq.listener.ActiveMQListener</listener-class> </listener> </web-app>
测试方法:向容器中发送和接收消息,成功证明整合成功。
2.SpringBoot中以Broker方式启动ActiveMQ
1.maven中增加如下配置:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.5.1</version> </dependency>
2.编写Listener
package cn.qlq.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.activemq.broker.BrokerService; public class ActiveMQListener implements ServletContextListener { private static final BrokerService brokerService = new BrokerService(); @Override public void contextDestroyed(ServletContextEvent arg0) { try { brokerService.stop(); System.out.println("broker 停止"); } catch (Exception e) { } } @Override public void contextInitialized(ServletContextEvent arg0) { try { brokerService.setUseJmx(true); brokerService.addConnector("tcp://localhost:61616"); brokerService.start(); System.out.println("broker 启动"); } catch (Exception e) { e.printStackTrace(); } } }
3.注册Listener到容器中:
package cn.qlq.config; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import cn.qlq.listener.ActiveMQListener;/** * * @author Administrator * */ @Configuration public class ListenerConfig { @Bean public ServletListenerRegistrationBean<ActiveMQListener> listenerRegist3() { ServletListenerRegistrationBean<ActiveMQListener> srb = new ServletListenerRegistrationBean<ActiveMQListener>(); srb.setListener(new ActiveMQListener()); return srb; } }
测试方法:向容器中发送和接收消息,成功证明整合成功。
3.SpringBoot整合ActiveMQ进行开发
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <!-- <version>5.7.0</version> --> </dependency>
application.properties增加activeMQ配置
spring.activemq.brokerUrl=tcp://127.0.0.1:61616
#spring.activemq.user=admin
#spring.activemq.password=123456
#spring.activemq.in-memory=true
#spring.activemq.pool.enabled=false
编写生产者代码:
package cn.qlq.activemq; import javax.jms.Destination; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Component; @Component("producer") public class Producer { // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装 @Autowired private JmsMessagingTemplate jmsTemplate; // 发送消息,destination是发送到的队列,message是待发送的消息 public void sendMessage(Destination destination, final String message) { jmsTemplate.convertAndSend(destination, message); } }
消费者代码:
package cn.qlq.activemq; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { // 使用JmsListener配置消费者监听的队列,其中text是接收到的消息 @JmsListener(destination = "myQueue") public void receiveQueue(String text) { System.out.println("Consumer收到的报文为:" + text); } }
测试代码:
import javax.jms.Destination; import org.apache.activemq.command.ActiveMQQueue; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import cn.qlq.MySpringBootApplication; import cn.qlq.activemq.Producer; @RunWith(SpringRunner.class) @SpringBootTest(classes = MySpringBootApplication.class) public class PlainTest { @Autowired private Producer producer; @Test public void contextLoads() throws InterruptedException { Destination destination = new ActiveMQQueue("myQueue"); for (int i = 0; i < 5; i++) { producer.sendMessage(destination, "message" + i); } } }
当然了这种方式也可以使用外部的ActiveMQ,也就是不用Broker方式启动ActiveMQ,以bat文件启动ActiveMQ之后整合方式同上。
git地址:https://github.com/qiao-zhi/springboot-ssm.git