@RabbitListener注解中returnException作用
时间: 2023-12-08 17:12:00 浏览: 104
`@RabbitListener`是Spring AMQP提供的一个注解,用于监听RabbitMQ消息队列中的消息。`returnException`是`@RabbitListener`注解中的一个属性,用于指定消息发送失败时的异常信息类型。
当消息发送失败时,RabbitMQ会将消息返回给生产者端,此时生产者端可以根据返回的消息进行相应的处理。如果在`@RabbitListener`注解中设置了`returnException`属性,则当消息发送失败时,Spring AMQP将会将返回的消息封装成指定类型的异常抛出,从而可以在代码中捕捉该异常并进行相应的处理。
例如,如果在`@RabbitListener`注解中设置了`returnException = MyException.class`,则当消息发送失败时,Spring AMQP将会将返回的消息封装成`MyException`类型的异常抛出。开发者可以在代码中捕捉该异常并进行相应的处理。
相关问题
详细代码演示微服务中台监控,中台接口要能记录服务调用次数,服务调用来源,自定义注解,发送消息到MQ,数据交互平台从MQ消费消息,插入到数据库
好的,这是一个比较大的问题,需要分多个步骤来进行演示。下面我将详细介绍如何实现微服务中台监控,并记录服务调用次数、服务调用来源、自定义注解,以及发送消息到MQ和消费消息插入到数据库。
1. 添加依赖
首先,需要在项目中添加Spring Boot的Actuator和Sleuth依赖,这两个依赖可以提供基本的微服务监控功能和跟踪功能。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
```
2. 自定义注解
为了记录服务调用来源,我们可以自定义一个注解`@Trace`,用于标识服务接口调用方。
```java
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Trace {
String value() default "";
}
```
3. 拦截器
为了记录服务调用次数和服务调用来源,我们需要使用拦截器,拦截服务接口的请求,然后进行记录。
```java
@Component
public class TraceInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceInterceptor.class);
private final Tracer tracer;
private final CounterService counterService;
public TraceInterceptor(Tracer tracer, CounterService counterService) {
this.tracer = tracer;
this.counterService = counterService;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Span currentSpan = this.tracer.currentSpan();
if (currentSpan != null) {
String traceId = currentSpan.context().traceId();
String spanId = currentSpan.context().spanId();
LOGGER.info("TraceId: {}, SpanId: {}", traceId, spanId);
}
// 记录服务调用次数
String uri = request.getRequestURI();
this.counterService.increment(uri);
// 记录服务调用来源
Method method = ((HandlerMethod) handler).getMethod();
Trace traceAnnotation = AnnotationUtils.findAnnotation(method, Trace.class);
if (traceAnnotation != null) {
String source = traceAnnotation.value();
LOGGER.info("Source: {}", source);
}
return true;
}
}
```
4. MQ消息发送
为了将服务调用信息发送到MQ,我们需要使用Spring Boot提供的`RabbitTemplate`。
```java
@Service
public class TraceService {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceService.class);
private final RabbitTemplate rabbitTemplate;
public TraceService(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void sendTraceMessage(String message) {
LOGGER.info("Sending trace message: {}", message);
this.rabbitTemplate.convertAndSend("trace", message);
}
}
```
5. MQ消息消费
为了将服务调用信息插入到数据库,我们需要使用Spring Boot提供的`@RabbitListener`注解,来消费MQ中的消息。
```java
@Component
public class TraceMessageListener {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceMessageListener.class);
private final JdbcTemplate jdbcTemplate;
public TraceMessageListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@RabbitListener(queues = "trace")
public void receiveTraceMessage(String message) {
LOGGER.info("Receiving trace message: {}", message);
String[] split = message.split(",");
String uri = split[0];
String source = split.length > 1 ? split[1] : "";
String sql = "INSERT INTO trace (uri, source) VALUES (?, ?)";
this.jdbcTemplate.update(sql, uri, source);
}
}
```
6. 配置文件
最后,我们需要在配置文件中进行配置,包括MQ的相关信息、拦截器、消息队列等。
```yaml
spring:
application:
name: demo
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
sleuth:
sampler:
probability: 1.0
management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: ${spring.application.name}
logging:
level:
com:
example:
demo: DEBUG
server:
port: 8080
trace:
mq:
queue: trace
```
以上就是微服务中台监控的实现过程,包括记录服务调用次数、服务调用来源、自定义注解、发送消息到MQ和消费消息插入到数据库。
springboot-rabbitMQ-websocket java 注解实现
下面是一个简单的 Spring Boot + RabbitMQ + WebSocket 的实现,以注解方式完成:
1. 首先,需要在 pom.xml 中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
2. 在 application.properties 中添加 RabbitMQ 和 WebSocket 的配置:
```properties
# RabbitMQ配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
# WebSocket配置
server.port=8080
```
3. 创建一个 RabbitMQ 的配置类,用于定义交换机、队列、绑定等:
```java
@Configuration
public class RabbitMQConfig {
@Bean
public TopicExchange exchange() {
return new TopicExchange("websocket-exchange");
}
@Bean
public Queue queue() {
return new Queue("websocket-queue");
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(exchange()).with("websocket.*");
}
}
```
4. 创建一个 RabbitMQ 消息发送者:
```java
@Component
public class RabbitMQSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(String message) {
rabbitTemplate.convertAndSend("websocket-exchange", "websocket.message", message);
}
}
```
5. 创建一个 WebSocket 处理器,用于接收和发送消息:
```java
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
sendMessage(payload);
}
public void sendMessage(String message) throws IOException {
for (WebSocketSession session : sessions) {
session.sendMessage(new TextMessage(message));
}
}
}
```
6. 创建一个 RabbitMQ 消息接收者,用于将消息发送给 WebSocket 处理器:
```java
@Component
public class RabbitMQReceiver {
@Autowired
private WebSocketHandler webSocketHandler;
@RabbitListener(queues = "websocket-queue")
public void receive(String message) throws IOException {
webSocketHandler.sendMessage(message);
}
}
```
7. 最后,在控制器中定义一个 API,用于发送消息到 RabbitMQ:
```java
@RestController
public class MessageController {
@Autowired
private RabbitMQSender rabbitMQSender;
@PostMapping("/send")
public String sendMessage(@RequestBody String message) {
rabbitMQSender.send(message);
return "OK";
}
}
```
以上就是一个简单的 Spring Boot + RabbitMQ + WebSocket 的实现,可以通过发送 POST 请求到 /send 接口来发送消息,WebSocket 处理器会接收到消息并发送给所有连接的客户端。
阅读全文