Spring STOMP-带注解的控制器

2024-05-13 02:44

本文主要是介绍Spring STOMP-带注解的控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

应用程序可以使用带@Controller 注解的类来处理来自客户端的消息。这些类可以声明带@MessageMapping@SubscribeMapping@ExceptionHandler 注解的方法,如下所述:

  • @MessageMapping
  • @SubscribeMapping
  • @MessageExceptionHandler

@MessageMapping

注释@MessageMapping 注解的方法,能处理对应destination的消息。注解支持方法和类级别。在类级别,@MessageMapping的配置会在所有方法上共享。

默认情况下,映射值是Ant风格的路径模式(例如/thing*/thing/**),也支持模板变量(例如,/thing/{id})。这些值可以通过带@DestinationVariable 注解的方法参数引用。应用程序也可以将destination的映射格式切换到点分隔的形式,如点作为分隔符中解释的一样。

支持的方法参数

下表描述了方法支持的参数:

方法参数描述
Message用于访问完整的消息内容。
MessageHeaders用于访问消息中的headers信息。
MessageHeaderAccessor, SimpMessageHeaderAccessor, and StompHeaderAccessor用于通过类型化访问器方法访问headers信息。
@Payload用于访问消息的payload,通过配置的MessageConverter将payload转换成指定类型(例如,从JSON)。这个注释不是必需显示声明,在没有其他参数匹配时,默认假定参数带了此注解。你可以使用@jakarta.validation.Valid或Spring的@Validated注解来注释payload参数,以自动校验payload参数。
@Header用于访问指定的header值 - 如果需要,可以使用org.springframework.core.convert.converter.Converter进行类型转换。
@Headers用于访问消息中的所有headers信息。此参数必须是java.util.Map的子类型。
@DestinationVariable用于访问消息destination值中的模板变量。根据需要,将值转换为对应方法参数的类型。
java.security.Principal代表了WebSocket HTTP握手时登录的用户。

返回值

默认情况下,@MessageMapping方法的返回值通过合适的MessageConverter序列化为payload,作为Message发送到brokerChannel,然后广播给订阅者。传出消息的destination值与传入消息的destination值相同,但以/topic为前缀。

你可以使用@SendTo@SendToUser注解来自定义输出消息的destination。@SendTo用于自定义指定destination或指定多个destination。@SendToUser用于将输出消息仅定向到与输入消息关联的用户。见用户目的地。

你可以同时在同一个方法上使用@SendTo@SendToUser,并且两者都支持在类级别上使用,在这种情况下,它们作为类中方法的默认值。然而,要记住任何方法级别的@SendTo@SendToUser注释值都会覆盖类级别上此类注释的值。

消息可以异步处理,@MessageMapping方法可以返回ListenableFutureCompletableFutureCompletionStage 类型。

请注意,@SendTo@SendToUser 注释仅仅是使用SimpMessagingTemplate发送消息的便利方式。如果必要,对于更高级的场景,@MessageMapping方法可以直接使用SimpMessagingTemplate。这可以作为返回值的替代方案,或者可能作为返回值的补充。见发送消息。

@SubscribeMapping

@SubscribeMapping类似于@MessageMapping,但只支持处理订阅消息。它支持与@MessageMapping相同的方法参数。然而,对于返回值,默认情况下,消息直接发送给客户端(通过clientOutboundChannel,响应订阅),而不是发送给代理(通过brokerChannel,作为匹配订阅的广播)。添加@SendTo@SendToUser会覆盖这种行为,会把返回值消息发送给代理。

这在什么时候有用?假设消息代理拦截的destination格式是/topic/queue,而应用程序控制器拦截的格式是/app。在这种设置中,代理存储所有/topic/queue的订阅,这些订阅旨在进行不断的广播,并且不需要应用程序参与。客户端还可以订阅某些/app目的地,控制器可以返回值来响应该订阅消息,而不需要涉及代理,不需要存储或再次使用订阅(实际上是一次性的请求-响应交换)。一个用例是在启动时用初始数据填充UI。

这在什么时候没用?不要尝试将消息代理和消息控制器映射到相同的destination前缀,除非出于某种原因,你希望两者都能独立处理消息,包括订阅。传入消息是被并行处理的。无法保证是代理还是控制器首先处理到消息。如果目标是在订阅存储并准备好广播时收到通知,如果服务器支持的话(简单代理不支持),客户端应该请求收据。例如,使用Java STOMP客户端,您可以执行以下操作以添加收据:

@Autowired
private TaskScheduler messageBrokerTaskScheduler;*// During initialization..*
stompClient.setTaskScheduler(this.messageBrokerTaskScheduler);*// When subscribing..*
StompHeaders headers = new StompHeaders();
headers.setDestination("/topic/...");
headers.setReceipt("r1");
FrameHandler handler = ...;
stompSession.subscribe(headers, handler).addReceiptTask(receiptHeaders -> {*// Subscription ready...*
});

服务端选项是在brokerChannel上注册一个ExecutorChannelInterceptor,并实现在处理完消息(包括订阅)后调用的afterMessageHandled方法。

@MessageExceptionHandler

应用程序可以使用@MessageExceptionHandler方法来处理来自@MessageMapping方法抛出的异常。您可以在注解上声明异常,也可以通过方法参数来获取异常实例的访问权限。以下示例展示通过方法参数来声明异常:

@Controller
public class MyController {*// ...*@MessageExceptionHandlerpublic ApplicationError handleException(MyException exception) {*// ...*return appError;}
}

@MessageExceptionHandler方法支持灵活的方法签名,并支持与@MessageMapping方法相同的方法参数类型和返回值。

通常,@MessageExceptionHandler方法适用于它所在的@Controller类(或类层次结构)中的异常。如果你希望这些方法可以全局使用(跨控制器),你可以在用@ControllerAdvice标记的类中声明它们。这类似于Spring MVC中提供的类似支持。

这篇关于Spring STOMP-带注解的控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984462

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定