中国加油,武汉加油!
篇幅较长,配合目录观看
案例准备
- 本案例基于springboot篇】二十一. 基于springboot电商项目 五 FreeMarker生成商品页面
- gitee地址 https://gitee.com/springboot-dubbo/nz1904-springboot-shop-05
1. springboot整合rabbitmq
1.1 shop-temp新建springboot-rabbitmq-provider(module-springboot)
- Spring Boot DevTools
- Lombok
- Spring Web
1.2 导相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
1.3 编写yml
spring:
rabbitmq:
host: 192.168.59.100
virtual-host: /
1.4 编写RabbitMQConfig
package com.wpj.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("myExchange");
}
@Bean
public Queue queue1(){
return new Queue("queue1");
}
@Bean
public Queue queue2(){
return new Queue("queue2");
}
@Bean
public Binding queue1ToExchange(){
return BindingBuilder.bind(queue1()).to(fanoutExchange());
}
@Bean
public Binding queue2ToExchange(){
return BindingBuilder.bind(queue2()).to(fanoutExchange());
}
}
1.5 修改程序入口
package com.wpj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.wpj")
public class SpringbootRabbitmqProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootRabbitmqProviderApplication.class, args);
}
}
1.6 Test
package com.wpj;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootRabbitmqProviderApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testRabbitMQ() {
String str = "hello";
rabbitTemplate.convertAndSend("myExchange","",str);
}
}
1.7 shop-temp新建springboot-rabbitmq-consumer(module-springboot)
- Spring Web
1.8 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
1.9 编写yml
spring:
rabbitmq:
host: 192.168.59.100
virtual-host: /
1.10 编写QueueConsumer
package com.wpj.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueueConsumer {
@RabbitListener(queues = "queue1")
public void queue1(String msg){
System.out.println("queue1" + msg);
}
@RabbitListener(queues = "queue2")
public void queue12(String msg){
System.out.println("queue2" + msg);
}
}
1.11 启动程序入口
package com.wpj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.wpj")
public class SpringbootRabbitmqConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootRabbitmqConsumerApplication.class, args);
}
}
2. 整合RabbitMQ到项目中
2.1 good-service
2.1.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.1.2 配置yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/nz1904-springboot-shop?characterEncoding=UTF8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
rabbitmq:
host: 192.168.59.100
virtual-host: /
mybatis-plus:
type-aliases-package: com.wpj.entity
mapper-locations: classpath:/mapper/*.xml
dubbo:
application:
name: goods-service
registry:
address: zookeeper://192.168.59.100:2181
protocol:
port: -1
2.1.3 编写RabbitMQConfig
package com.wpj.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("goods-exchange");
}
@Bean
public Queue solrQueue(){
return new Queue("solrQueue");
}
@Bean
public Queue itemQueue(){
return new Queue("itemQueue");
}
@Bean
public Binding solrQueueToExchange(){
return BindingBuilder.bind(solrQueue()).to(fanoutExchange());
}
@Bean
public Binding itemQueueToExchange(){
return BindingBuilder.bind(itemQueue()).to(fanoutExchange());
}
}
2.1.4 修改GoodServiceImpl
package com.wpj.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.wpj.entity.Goods;
import com.wpj.mapper.IGoodsMapper;
import com.wpj.service.IGoodService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class GoodsServiceImpl extends BaseServiceImpl<Goods> implements IGoodService {
@Autowired
private IGoodsMapper iGoodsMapper;
@Override
public BaseMapper<Goods> getMapper() {
return iGoodsMapper;
}
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public int insert(Goods goods) {
int insert = super.insert(goods);
rabbitTemplate.convertAndSend("goods-exchange","", goods);
return insert;
}
}
2.2 search-service
2.2.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.2.2 配置yml
dubbo:
registry:
address: zookeeper://192.168.59.100:2181
application:
name: search-service
protocol:
port: -1
spring:
data:
solr:
host: http://192.168.59.100:8983/solr/mycollection
rabbitmq:
host: 192.168.59.100
virtual-host: /
2.2.3 编写RabbitMQConfig
package com.wpj.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("goods-exchange");
}
@Bean
public Queue solrQueue(){
return new Queue("solrQueue");
}
@Bean
public Binding solrQueueToExchange(){
return BindingBuilder.bind(solrQueue()).to(fanoutExchange());
}
}
2.2.4 编写SolrQueueListener
package com.wpj.listener;
import com.wpj.entity.Goods;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class SolrQueueListener {
@Autowired
private SolrClient solrClient;
@RabbitListener(queues = "solrQueue")
public void solrQueue(Goods goods){
SolrInputDocument document = new SolrInputDocument();
document.addField("id",goods.getId());
document.setField("gname", goods.getGname());
document.setField("gdesc", goods.getGdesc());
document.setField("gpic", goods.getGpic());
document.setField("gprice", goods.getGprice().toString());
try {
solrClient.add(document);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3 shop-item
2.3.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.3.2 配置yml
server:
port: 8083
dubbo:
application:
name: item-web
registry:
address: zookeeper://192.168.59.100:2181
check: false
consumer:
check: false
retries: 3
spring:
rabbitmq:
host: 192.168.59.100
virtual-host: /
2.3.3 编写RabbitMQConfig
package com.wpj.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("goods-exchange");
}
@Bean
public Queue itemQueue(){
return new Queue("itemQueue");
}
@Bean
public Binding itemQueueToExchange(){
return BindingBuilder.bind(itemQueue()).to(fanoutExchange());
}
}
2.3.4 编写ItemQueueListener
package com.wpj.listener;
import com.alibaba.dubbo.config.annotation.Reference;
import com.wpj.controller.ItemController;
import com.wpj.entity.Goods;
import com.wpj.service.IGoodService;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class ItemQueueListener {
@Reference
private IGoodService goodService;
@Autowired
private freemarker.template.Configuration configuration;
@RabbitListener(queues = "itemQueue")
public void itemQueue(Goods goods){
String[] split = goods.getGpic().split("\\|");
Map<String,Object> map = new HashMap<>();
map.put("goods",goods);
map.put("picList",split);
map.put("contextPath","/");
Template template = null;
Writer writer =null;
try {
template = configuration.getTemplate("goodsItem.ftl");
String staticPath = ItemController.class.getClassLoader().getResource("static").getPath();
File file = new File(staticPath+File.separator+"goods");
if(!file.exists()){
file.mkdir();
}
writer = new FileWriter(file.getAbsolutePath()+File.separator+goods.getId()+".html");
template.process(map,writer);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3. 校验
- localhost:8080 进去添加商品
- localhost:8081 进入查找商品
- 点进去新增的商品进入生成的页面