继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringBoot整合RabbitMQ(二)单机抢票系统

慕田峪4524236
关注TA
已关注
手记 204
粉丝 19
获赞 50

在这个项目里我用的是 springboot的2版本,ORM选用 JPA快速开发,JSON工具使用阿里的 fastjson,当然,mq用的是 rabbitMQ。导入的是 springboot集成的依赖。

1. 配置部分

1.1 pom.xml
  1.    <dependencies>

  2.        <dependency>

  3.            <groupId>org.springframework.boot</groupId>

  4.            <artifactId>spring-boot-starter</artifactId>

  5.        </dependency>


  6.        <dependency>

  7.            <groupId>org.springframework.boot</groupId>

  8.            <artifactId>spring-boot-starter-test</artifactId>

  9.            <scope>test</scope>

  10.        </dependency>

  11.        <dependency>

  12.            <groupId>org.springframework.boot</groupId>

  13.            <artifactId>spring-boot-starter-web</artifactId>

  14.        </dependency>

  15.        <dependency>

  16.            <groupId>mysql</groupId>

  17.            <artifactId>mysql-connector-java</artifactId>

  18.        </dependency>

  19.        <dependency>

  20.            <groupId>org.springframework.boot</groupId>

  21.            <artifactId>spring-boot-starter-data-jpa</artifactId>

  22.        </dependency>

  23.        <dependency>

  24.            <groupId>org.projectlombok</groupId>

  25.            <artifactId>lombok</artifactId>

  26.            <version>1.16.18</version>

  27.        </dependency>

  28.        <dependency>

  29.            <groupId>org.springframework.boot</groupId>

  30.            <artifactId>spring-boot-starter-amqp</artifactId>

  31.        </dependency>

  32.        <dependency>

  33.            <groupId>com.alibaba</groupId>

  34.            <artifactId>fastjson</artifactId>

  35.            <version>RELEASE</version>

  36.            <scope>compile</scope>

  37.        </dependency>

  38.    </dependencies>

1.2 application.properties
  1. server.port=10000


  2. spring.datasource.url=jdbc:mysql://xxxxx/xxxxx?characterEncoding=utf-8

  3. spring.datasource.username=xxx

  4. spring.datasource.password=xxxx

  5. spring.datasource.driver-class-name=com.mysql.jdbc.Driver


  6. spring.jpa.properties.hibernate.hbm2ddl.auto=update

  7. spring.jpa.show-sql=true


  8. spring.rabbitmq.host=localhost

  9. spring.rabbitmq.username=root

  10. spring.rabbitmq.password=root

  11. spring.rabbitmq.port=5672

我只是很有针对性的对 mq和 datasource进行了配置。

1.3 数据表
  1. create table if not result

  2. (

  3.    id int auto_increment primary key,

  4.    ticket_id int null,

  5.    user_id int null

  6. );


  7. create table if not exists ticket

  8. (

  9.    id int auto_increment primary key,

  10.    name varchar(255) null,

  11.    content varchar(255) null,

  12.    user_name varchar(20) null,

  13.    count int default '6666' not null

  14. );

根据数据表可以Generate出JavaBean,不贴JavaBean了。 ##### 1.4 项目架构

├── src│   ├── main│   │   ├── java│   │   │   └── com│   │   │       └── fantj│   │   │           └── springbootjpa│   │   │               ├── AMQP.java│   │   │               ├── controller│   │   │               │   └── TicketController.java│   │   │               ├── mq│   │   │               │   ├── Message.java│   │   │               │   ├── MQConstants.java│   │   │               │   ├── MQReceiver.java│   │   │               │   └── MQSender.java│   │   │               ├── pojo│   │   │               │   ├── Result.java│   │   │               │   └── Ticket.java│   │   │               ├── repostory│   │   │               │   ├── ResultRepository.java│   │   │               │   └── TicketRepository.java│   │   │               └── service│   │   │                   ├── ResultServiceImpl.java│   │   │                   ├── ResultService.java│   │   │                   ├── TicketServiceImpl.java│   │   │                   └── TicketService.java│   │   └── resources│   │       ├── application.properties│   │       └── rebel.xml

2. 启动类

@SpringBootApplication@EntityScan("com.fantj.springbootjpa.pojo")@EnableRabbitpublic class AMQP {    public static void main(String[] args) {        SpringApplication.run(AMQP.class, args);    }}

注意这个 @EnableRabbit注解,它会开启对rabbit注解的支持。

3. controller

很简单的一个controller类,实现查询和抢票功能。

  1. @RestController

  2. @RequestMapping("/ticket")

  3. public class TicketController {

  4.    @Autowired

  5.    private TicketService ticketService;

  6.    @Autowired

  7.    private MQSender mqSender;


  8.    @RequestMapping("/get/{id}")

  9.    public Ticket getByid(@PathVariable Integer id){

  10.        return ticketService.findById(id);

  11.    }


  12.    @RequestMapping("/reduce/{id}/{userId}")

  13.    public String reduceCount(@PathVariable Integer id,

  14.                              @PathVariable Integer userId){

  15.        Message message = new Message(id,userId);


  16.        ticketService.reduceCount(id);

  17.        mqSender.sendMessage(new Message(message.getTicketId(),message.getUserId()));

  18.        return "抢票成功!";

  19.    }

  20. }

注意 privateMQSendermqSender;这是我的 rabbit发送消息的类。

4. Service

接口我就不再这里贴出,直接贴实现类。

4.1 ResultServiceImpl.java
  1. @Service

  2. public class ResultServiceImpl implements ResultService{


  3.    @Autowired

  4.    private ResultRepository resultRepository;

  5.    @Override

  6.    public void add(Result result) {

  7.        resultRepository.add(result.getTicketId(), result.getUserId());


  8.    }


  9.    @Override

  10.    public Result findOneByUserId(Integer userId) {

  11.        return resultRepository.findByUserId(userId);

  12.    }

  13. }

4.2 TicketServiceImpl.java
  1. @Service

  2. public class TicketServiceImpl implements TicketService{


  3.    @Autowired

  4.    private TicketRepository repository;

  5.    @Override

  6.    public Ticket findById(Integer id) {

  7.        return repository.findTicketById(id);

  8.    }


  9.    @Override

  10.    public Ticket reduceCount(Integer id) {

  11.        repository.reduceCount(id);

  12.        return findById(id);

  13.    }

  14. }

这两个都是很普通的service实现类,没有新加入的东西。

5. Dao

5.1 ResultRepository.java
  1. @Repository

  2. public interface ResultRepository extends JpaRepository<Result,Integer> {


  3.    @Transactional

  4.    @Modifying

  5.    @Query(value = "insert into result(ticket_id,user_id) values(?1,?2) ",nativeQuery = true)

  6.    void add(@Param("ticketId") Integer ticketId,@Param("userId") Integer userId);


  7.    Result findByUserId(Integer userId);

  8. }

5.2 TicketRepository.java
@Repositorypublic interface TicketRepository extends JpaRepository<Ticket,Integer>{    /**     *  减少库存     */    @Transactional    @Modifying    @Query(value = "update ticket t set t.count=t.count+(-1) where id=?1",nativeQuery = true)    int reduceCount(Integer id);    /**     * 查询信息     */    Ticket findTicketById(Integer id);}

到了这里,你会发现,md哪里有用mq的痕迹...


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP