在自己的项目结构中创建module
选择对应的spring Initializr, jdk,点击继续,根据提示创建完成项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.13</version>
</dependency>
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
<version>1.0.3</version>
</dependency>
<!--整合mq end-->
在配置文件中添加配置
spring.activemq.user=admin
spring.activemq.password=******
spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.in-memory=true
spring.activemq.send-timeout=0
spring.activemq.non-blocking-redelivery=false
spring.activemq.pool.enabled=true
spring.activemq.packages.trust-all=true
spring.jms.pub-sub-domain=true
创建配置文件
@Configuration
public class ActiveMqConfig {
// queue模式的ListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
// topic模式的ListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
//收发消息的时候,自动把java对象转化成json数据
@Bean
public MessageConverter jacksonJmsConverter(){
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
// 这个用于设置 @JmsListener使用的containerFactory
@Bean
public JmsListenerContainerFactory<?> msgFactory(ConnectionFactory cf,
DefaultJmsListenerContainerFactoryConfigurer configurer,
PlatformTransactionManager transactionManager) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, cf);
factory.setTransactionManager(transactionManager);
//factory.setCacheLevelName("CACHE_CONNECTION");
factory.setReceiveTimeout(10000L);
factory.setConcurrency("10");//设置并发的去读消息
return factory;
}
@Bean
public ConnectionFactory connectionFactory(){
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
TransactionAwareConnectionFactoryProxy proxy = new TransactionAwareConnectionFactoryProxy();
proxy.setTargetConnectionFactory(cf);
proxy.setSynchedLocalTransactionAllowed(true);
return proxy;
}
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory){
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setSessionTransacted(true);
return jmsTemplate;
}
}
创建controller 其中 sendOceanQueue第一个参数是mq中的唯一标识OceanQueues, msg是传入的信息值。
接口分两种,一种是点对点,一种是订阅
@GetMapping("common")
public void common(HttpServletRequest request,
HttpServletResponse response, String msg) {
producerService.sendOceanQueue("OceanQueues" , msg);
System.out.println(msg);
BaseAppUtils.responseStr(response,msg);
//return JsonUtils.buildSuccess("ok");
}
/*
订阅
多个消费者获取数据
*/
@GetMapping("commonTopic")
public void commonTopic(HttpServletRequest request,
HttpServletResponse response) {
for (int i = 1; i <= 10; i++) {
System.out.println("第" + i + "次发送字符串主题消息");
producerService.sendOceanTopic("OceanTopic" ,"ocean消息:"+ i);
}
}
serivice
/**
* @auther ocean li
* @date 2020/11/27 - 15:01
*/
public interface ProducerService {
/**
* 使用默认消息队列发送消息
* @param message
*/
public void sendOceanQueue(String queueName , String message);
public void sendOceanTopic(String queueName , String message);
}
Impl 其中
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
是在配置文件中的
@Service
@Transactional// 注解
public class ProducerServiceImpl implements ProducerService {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Override
public void sendOceanQueue(String queueName , String message) {
jmsMessagingTemplate.convertAndSend(new ActiveMQQueue(queueName), message);
}
@Override
public void sendOceanTopic(String queueName, String message) {
this.jmsMessagingTemplate.convertAndSend(new ActiveMQTopic(queueName), message);
}
}
到此生产者已经创建完毕