学生个人网站建设方案书框架栏目,windows server2012 wordpress,南京模板建站哪家好,网站做排名有用吗目录 1. 说明2. 截图2.1 接口调用截图2.2 项目结构截图 3. 代码示例 1. 说明
1.实现的是一个简单的sse接口#xff0c;单向的长连接#xff0c;后端可以向前端不断输出数据。2.通过调用sse接口#xff0c;触发rabbitmq向队列塞消息#xff0c;向前端返回一个sseEmitter对象… 目录 1. 说明2. 截图2.1 接口调用截图2.2 项目结构截图 3. 代码示例 1. 说明
1.实现的是一个简单的sse接口单向的长连接后端可以向前端不断输出数据。2.通过调用sse接口触发rabbitmq向队列塞消息向前端返回一个sseEmitter对象。3.rabbitmq监听队列消息消费消息后向sseEmitter对象写入内容。4.当业务逻辑结束调用emitter.complete()方法结束此次会话。5.这里举一个问答的示例采用的是work模式逻辑比较简单仅供参考。
2. 截图
2.1 接口调用截图 2.2 项目结构截图 3. 代码示例
1.pom依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.4/version/parentgroupIdcom.learning/groupIdartifactIdspringboot/artifactIdversion1.0-SNAPSHOT/versiondependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.5.4/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.4/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependencies!--打jar包使用--buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build
/project2.application.yaml
spring:# rabbbitmq配置信息rabbitmq:host: 192.168.2.11port: 5672username: adminpassword: adminvirtual-host: /3.rabbitmq配置类
package com.learning.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;/*** rabbitmq配置类*/
Configuration
public class RabbitMQConfig{/*** 存sseEmitter*/Bean(emitterMap)public ConcurrentMapString, SseEmitter emitterMap(){ConcurrentMapString, SseEmitter emitters new ConcurrentHashMap();return emitters;}/*** 工作模式交换机名*/public static final String EXCHANGE_NAME work_exchange;/*** 工作模式队列名*/public static final String QUEUE_NAME work_queue; Bean(work_queue)public Queue queue() { return new Queue(QUEUE_NAME, true); } Bean(work_exchange)public Exchange exchange() {return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(true).build();} Bean public Binding binding(Qualifier(work_queue) Queue queue,Qualifier(work_exchange) Exchange exchange) {return BindingBuilder.bind(queue).to(exchange).with(work_routing_key).noargs();}
}4.controller类
package com.learning.controller;import com.learning.service.QuestionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;/*** Author wangyouhui* Description 获取答案**/
RestController
RequestMapping(/question)
public class QuestionController {Autowiredprivate QuestionService questionService;Autowiredprivate ConcurrentMapString, SseEmitter emitterMap;PostMapping(value/ask, produces MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter ask(RequestParam String question) {String questionId UUID.randomUUID().toString();SseEmitter emitter new SseEmitter();emitterMap.put(questionId, emitter);questionService.ask(questionId, question);return emitter;}
}
5.消息实体
package com.learning.dto;import lombok.Data;import java.io.Serializable;/*** Author wangyouhui* Description 消息**/
Data
public class MessageDTO implements Serializable {private String questionId;private String question;private String answer;private Boolean end;
}
6.service实现类
package com.learning.service.impl;import com.fasterxml.jackson.databind.ObjectMapper;
import com.learning.config.RabbitMQConfig;
import com.learning.dto.MessageDTO;
import com.learning.service.QuestionService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.concurrent.ConcurrentMap;/*** Author wangyouhui* Description**/
Service
public class QuestionServiceImpl implements QuestionService {Autowiredprivate RabbitTemplate rabbitTemplate;Autowiredprivate ConcurrentMapString, SseEmitter emitterMap;RabbitListener(queues RabbitMQConfig.QUEUE_NAME, ackMode MANUAL)public void receiveMessage(Message message, Channel channel) {long deliveryTag message.getMessageProperties().getDeliveryTag();try {String json new String(message.getBody());ObjectMapper mapper new ObjectMapper();MessageDTO messageDTO mapper.readValue(json, MessageDTO.class);SseEmitter sseEmitter emitterMap.get(messageDTO.getQuestionId());if(sseEmitter ! null){sseEmitter.send(messageDTO);}if(messageDTO.getEnd() ! null messageDTO.getEnd()){sseEmitter.complete();emitterMap.remove(messageDTO.getQuestionId());}// 手动签收channel.basicAck(deliveryTag, false);} catch (IOException e) {e.printStackTrace();// 拒绝签收消息重新入队try {channel.basicReject(deliveryTag, true);} catch (IOException ioException) {ioException.printStackTrace();}}}Overridepublic void ask(String questionId, String question) {MessageDTO message1 new MessageDTO();message1.setQuestionId(questionId);message1.setQuestion(question);message1.setAnswer(您好这个);message1.setEnd(false);this.sendMessage(message1);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}MessageDTO message2 new MessageDTO();message2.setQuestionId(questionId);message2.setQuestion(question);message2.setAnswer(您好这个是答案);message2.setEnd(false);this.sendMessage(message2);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}MessageDTO message3 new MessageDTO();message3.setQuestionId(questionId);message3.setQuestion(question);message3.setAnswer(您好这个是答案,请问是否能解决你的问题);message3.setEnd(true);this.sendMessage(message3);}public void sendMessage(MessageDTO message){ObjectMapper mapper new ObjectMapper();String json null;try {json mapper.writeValueAsString(message);rabbitTemplate.convertAndSend(work_exchange, work_routing_key, json);} catch (Exception e) {e.printStackTrace();}}
}
7.service接口
package com.learning.service;/*** Author wangyouhui* Description **/
public interface QuestionService {void ask(String questionId, String question);
}
8.应用类
package com.learning;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Author wangyouhui* Description**/
SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}