1. 创建两个maven项目,这是为了模拟分布式应用系统中,两个应用之间互相交流的过程,一个发送者(Sender),一个接收者(Receiver)
2. 两个项目的pom中添加rabbitmq的依赖
<!-- 添加springboot对amqp的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.在application.properties配置mq的参数
spring.application.name=springboot-rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=scan
spring.rabbitmq.password=scan
spring.rabbitmq.virtual-host=/ws
用户名,密码,host在管理界面可以配置http://localhost:15672/#/vhosts
4.在生产者中往队列发送消息
@Configuration
public class RabbitMqConfig {
//以下配置RabbitMQ消息服务
@Autowired
public ConnectionFactory connectionFactory;
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(jsonMessageConverter());
//factory.setConcurrentConsumers(3);
//factory.setMaxConcurrentConsumers(10);
return factory;
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(jsonMessageConverter());
return template;
}
@Bean
FanoutExchange exchange() {
return new FanoutExchange("exchange");
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class WsScanApplicationTests {
@Autowired
private RabbitTemplate amqpTemplate;
@Test
public void contextLoads() {
ScanData a = new ScanData();
a.setAPI_ID("API_ID1111111111");
a.setAPI_VER("API_VER11111");
a.setBAG_ID("BAG111111");
a.setBCH_ID("BRC_ID11111");
amqpTemplate.convertAndSend("exchange","routingKey",a);
}
}
4.在消费者中自动创建队列接收广播交换机的信息
默认自动ack
@Configuration
public class RabbitMqConfig {
@Autowired
public ConnectionFactory connectionFactory;
/** * 消费者数量,默认10 */
public static final int DEFAULT_CONCURRENT = 4;
/** * 每个消费者获取最大投递数量 默认50 */
public static final int DEFAULT_PREFETCH_COUNT = 50;
@Bean
public Queue queueMessage() {
return new Queue("ws_scan_data");
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(jsonMessageConverter());
//手动编写线程并发消费,避免数据库读写异常
/*factory.setConcurrentConsumers(DEFAULT_CONCURRENT);
factory.setMaxConcurrentConsumers(DEFAULT_PREFETCH_COUNT);*/
return factory;
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(jsonMessageConverter());
return template;
}
}
@Component
public class WcForWsReceiver {
//线程任务分发
@Autowired
private ExecuteManager manager;
private static Logger log = LoggerFactory.getLogger(WcForWsReceiver.class);
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "ws_scan_data",durable = "true"),
exchange = @Exchange(value = "exchange",durable = "true",type = "fanout"),
key = "routingKey"
))
@RabbitHandler
public void process(@Payload ScanData data) {
try {
manager.sendMsg(data);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}