Spring web-flux 响应式编程

1、基于传统的结构 Demo (仅仅作为快速了解,生产环境不会用这种)

请求处理类 Controller 类

package com.yootk.webflux.handler;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

// 最基础的Reactor 实现
@Component //进行组件注册(让spring 识别并管理这个类	)
public class MessageHandler{ //这是一个WebFlux处理模块(接收请求,并处理请求)
	// 在 WebFlux 编程里面如果要进行响应的话会区分单个响应(单一对象)以及多个响应(集合)

	// Mono 只能接收单个对象 
	// 接收请求,并响应这个请求
	public Mono<ServerResponse>echoHandler(ServerRequest request){
		return ServerResponse.ok().header("Context-Type","text/html;charset=UTF-8"). //响应头信息
		body(BodyInserters.fromValue("沐言科技:www.yootk.com"));
	}
}

路由类 Router 类

package com.yootk.webflux.router;

import com.yootk.webflux.handler.MessageHandler; // 导入Controller 类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.*;

@Configuration
public class MessageRouter { //消息路由处理
  	 @Bean // 进行路由的功能注册
  	 public RouterFunctions.route(RequestPredicates.GET("/echo"). // 匹配最终的处理路由地址
  	 add(RequestPredicates.accept(MediaType.TEXT_PLAIN)// 设置了匹配的请求类型
  	 ,messageHandler::echoHandler); //匹配最终的处理路由地址
  	 }
 }

2、SpringBoot 整合 WebFlux

  • 创建一个 VO 类 ==> Message , 这个类负责接收用户的请求数据
package com.yootk.vo;

import lombok.Data;
import java.util.Date;

@Data
public class Message {
	private String title;
	private Data pubdate;
	private String context;
}
  • 创建一个 WebFlux 专属的请求处理类
package com.yootk.webflux.handler;

import com.yootk,vo.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.Map;

@Component //进行组件注册
@Slf4j //日志输出
public class MessageHandler { //这是一个WebFlux 处理模块
		public Flux<Message> list(Message message) { //返回集合数据
			List<Message> messageList = new ArrayList<>(); //创建一个List 集合
			for (int x = 0;x<10;i++){ //10个长度的集合
				 Message msg = new Message(); //创建新的Message 实例
				 msg.setTitle("["+x+"]" + message.getTitle());
				   msg.setContent("["+x+"]" + message.getContent());
				   msg.setPubdate(message.getPubdate());// 直接使用已经配置的日期时间
				   messageList.add(msg); //实现集合的存储
			}
			return Flux.fromIterable(messageList);// 实现了集合响应
		}
		
		// 每一次进行响应结果配置的时候,都只能够配置具体的类型
		public Flux<Map.Entry<String,Message>>map(Message message){
				Map<String,Message> map = new HashMap<>();
				for (int i = 0;i<10;i++) { // 通过迭代配置数据
						Message msg = new Message(); // 创建新的Message 实例
						msg.setTitle("["+ i + "]" + message.getTitle());
						msg.setContent("[" +i + "]" + message.getContent());
						msg.setPubdate(message.getPubdate());// 直接使用已经配置的日期时间
						map.put("yootk---" + i,msg); // 保存Map 集合
				}
				return Flux.fromIterable(map.entrySet());
		}

		//此时不再关注传统的ServerResponse以及ServletRequest类型了
		// Mono 只能处理单个对象
		public Mono<Message>echoHandler(Message message){ //直接以最终的数据类型进行操作
		log.info("{} 业务层接收处理数据:{}",Thread.currentThread().getName(),message);
		message.setTitle("["+Thread.currentThread.getName()+"]"+message.getTitle());
		message.setContent("["+Thread.currentThred().getName()+"]"+message.getContent());
		return Mono.create(monoSink->monoSink.success(message));// 实现数据响应
		}
}
  • SpringBoot 之中所有的请求需要通过Action类(或者Controller) 进行访问,那么最佳的路由配置就是由Action类(或者Controller)进行处理了
package com.yootk.action;

impo.rt com.yootk.vo.Message;
import com.yootk.webflux.handler.MessageHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.bean.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequstMapping("/message/*")
@Slf4j
public class MessageAction{ //正常访问的路由配置

	@Autowired
	private MessgeHandler messageHandler; // WebFlux 处理程序
	
	@RequestMapping("echo")
	public Object echo(Message message){
		log.info("接收用户信息,用户发送的参数为: message = {}",message);
		return this.messageHandler.echoHandler(message);
	}

	// 请求url  localhost:8080/message/list?title=沐言科技&content=www.yootk.com&pubdate=2025-10-01
	@RequestMapping("list")
	public Object list(Message message) {
		log.info ("接收用户根信息,用户发送的参数为: message = {}",message);
		return this.messageHandler.list(message);
	}

	// 请求url  localhost:8080/message/map?title=沐言科技&content=www.yootk.com&pubdate=2025-10-01
	@RequestMapping("map")
	public Object map(Message message){
		 	log.info ("接收用户根信息,用户发送的参数为: message = {}",message);
		 	return this.messageHandler.map(message);
	}
}
  • 使用 Flux 包装需要返回的集合数据信息(List集合、Map集合)
    (Flux 能包装集合数据)

你可能感兴趣的:(spring,boot,开发语言,后端,java)