broker
简介:broker可以内置在代码中,即启动项目的时候就可以自动开启消息队列。即实现嵌入式的组件。
依赖的包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
测试开启代码
public class EmbedBroker {
public static void main(String[] args) throws Exception {
// 1.创建服务
BrokerService broker = new BrokerService();
// 2、配置连接地址 本地的端口号
broker.addConnector("tcp://localhost:61616");
// 3、启动
broker.start();
// 对于springboot项目可以把这个做成一个bean或者做成一个服务
}
}
mq整合springboot
整合springboot的步骤:
- 加依赖。
- 看XXXXproperties和XXXXautoConfiguration
- 导入bean
先看properties类
我们可以得到配置文件都是以spring.activemq开头的
回想一下api时候我们配置类里面配置的参数这里都可以配置。
spring:
activemq:
broker-url: "tcp;//127.0.0.1:61616"
再看看autoconfiguration
@Configuration(proxyBeanMethods = false) // 不用代理
@AutoConfigureBefore(JmsAutoConfiguration.class) // 先加载jms的bean 这里也就说我们可以通过配置jms的服务从而修改activemq的属性
@AutoConfigureAfter({ JndiConnectionFactoryAutoConfiguration.class })// 在初始化以后调用连接工厂这个就和我们api测试的时候对应起来了 创建连接工厂----》创建session会话
// 要有下面的类才能生效
@ConditionalOnClass({ ConnectionFactory.class, ActiveMQConnectionFactory.class })
@ConditionalOnMissingBean(ConnectionFactory.class)
// 将activemq和jms的配置加进来
@EnableConfigurationProperties({ ActiveMQProperties.class, JmsProperties.class })
@Import({ ActiveMQXAConnectionFactoryConfiguration.class, ActiveMQConnectionFactoryConfiguration.class })
public class ActiveMQAutoConfiguration {
}
我们猫一眼JmsProperties的配置
@ConfigurationProperties(prefix = "spring.jms")
public class JmsProperties {
// 是否开启订阅
private boolean pubSubDomain = false;
private String jndiName;
// 缓存 下面有配置cache的属性 里面默认producers为true consumers为false
private final Cache cache = new Cache();
// 监听
private final Listener listener = new Listener();
// 模板 这里面可以看到是否持久化等等的配置
private final Template template = new Template();
// 这里有AcknowledgeMode的枚举类就是api里面session的按个参数
//DeliveryMode 是枚举类型是我们持久化的枚举类
小结:springboot集成activemq没有什么新东西,只要知道activemq的对象配置不仅从activemq里面有 还有jms也可以配置。
queue队列
要使用activemq要首先写一个bean
// 注意导包,util java中的队列
// JMS 下的队列
import javax.jms.Queue;
@Configuration
@EnableJms // 声明对 JMS 注解支持
public class ActiveMQConfig {
@Value("${myqueue}")
private String myqueue;
@Bean
public Queue queue(){
return new ActiveMQQueue(myqueue);
}
}
编写发送指令
public String jmsMessageTest(){
jmsTemplate.convertAndSend(queue,"this is a message");
return "ok";
}
指令接收:
@JmsListener(destination = "ubw")
public void jmsMessageReceive(Message message) throws JMSException {
TextMessage text = (TextMessage)message;
System.out.println(text.getText());
}
topic主题
看了源码,topic需要先更改一些配置。
/**
* Whether the default destination type is topic.
默认主题模型 这里是false 所以目前是queue
*/
private boolean pubSubDomain = false;
所以这里我们要改成topic模型
jms:
pub-sub-domain: true
其余代码基本不变
public String jmsMessageTopic(){
jmsTemplate.convertAndSend(topic,"this is a message");
return "ok";
}
@JmsListener(destination = "ubwTopic")
public void jmsMessageReceiveTopic(Message message) throws JMSException {
TextMessage text = (TextMessage)message;
System.out.println(text.getText());
}