当前位置: 首页 > 知识库问答 >
问题:

SimpMessageTemplate在spring boot中不发送消息

孟晨朗
2023-03-14

嗨,我正在尝试发送消息到跺脚endpoint,但我没有得到任何。我使用的是带有跺脚的Spring靴,下面是我的课程

@Controller
public class GreetingController {

  @MessageMapping("/hello")
  @SendTo("/topic/greetings")
  public Greeting greeting(HelloMessage message) throws Exception {
    System.out.println(message.getName());
    Thread.sleep(13000); // simulated delay
    return new Greeting("Hello, " + message.getName() + "!");
  }

}

@Controller                                                
public class Testcont {

  @Autowired
  private SimpMessagingTemplate messageSender;

  @RequestMapping(value="/Users/get",method=RequestMethod.POST)
  @ResponseBody
  public String getUser(@RequestParam(value = "userId") String userId, @RequestParam(value = "password") String password, @RequestParam(value="port") String port, HttpServletRequest request) {
    HelloMessage mess=new HelloMessage();
    mess.setName(userId);
    messageSender.convertAndSend("/app/hello",mess);
    return "Success";

}

以及我对websocket的配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello").withSockJS();
    }

}

我在控制台上没有收到任何错误。上面的代码在web浏览器中运行良好。

共有2个答案

党星鹏
2023-03-14

我在使用WebSocket时也面临同样的问题。对于这篇文章来说已经太晚了,但是对于正在寻找答案的人来说可能会有用。

SimpMessageTemplate-

来自上述WebSocket文档:

“ClientInbound频道” — 用于传递从WebSocket客户端接收的消息。

“clientOutboundChannel” — 用于向WebSocket客户端发送服务器消息。

“brokerChannel” — 用于从服务器端向message broker发送消息的应用程序代码。

>

  • 客户端连接到“http://localhost:8080/portfolio一旦建立了WebSocket连接,STOMP帧就开始在其上流动(在您的例子中:registry.addEndpoint(“/hello”)。使用sockjs(),您使用“hello”,在文档中,它使用“portfolio”。)

    客户端发送带有目标标题“/topic/hello”的订阅帧。收到并解码后,消息将发送到“clientInboundChannel”,然后路由到存储客户端订阅的message broker。(这是订阅WebSocket的用户界面,这里没有相关代码。没关系。)

    客户端向“/app/hello”发送发送帧。“/app”前缀有助于将其路由到带注释的html" target="_blank">控制器。去掉“/app”前缀后,目标的剩余“/hello”部分将映射到GreetingController中的@MessageMapping方法。(在您的代码中:@MessageMapping(“/hello”)将接收帧。)

    从GreetingController返回的值被转换为一条Spring消息,该消息的有效负载基于返回值和默认目的地标题“/topic/hello”(从输入目的地派生,其中“/app”替换为“/topic”)。生成的消息被发送到“brokerChannel”并由消息代理处理。(因此,当您尝试将数据放入服务器的WebSocket中时:messageSender.convertAndSend(“/app/hello”,mess);应更改为messageSender。convertAndSend(“/topic/hello”,mess),因为它已经在服务器中,我们不需要目的地前缀,但需要代理前缀。)

    message broker会找到所有匹配的订阅者,并通过“clientOutboundChannel”向每个订阅者发送一个消息帧,消息从该通道编码为STOMP帧,并通过WebSocket连接发送。

  • 陈哲
    2023-03-14

    SimpMessagingTemplatebean正好用于代理部分(AbstractMessageBrokerConfiguration):

    @Bean
    public SimpMessagingTemplate brokerMessagingTemplate() {
        SimpMessagingTemplate template = new SimpMessagingTemplate(brokerChannel());
        String prefix = getBrokerRegistry().getUserDestinationPrefix();
        if (prefix != null) {
            template.setUserDestinationPrefix(prefix);
        }
    

    由于您没有将消息发送到代理目的地(在您的情况下是/app/),因此此类消息将被AbstractBrokerMessageHandler.checkCustinationPrefix(目的地)忽略。

    如果您希望通过相同的@MessageMapping处理该内部消息,则应直接使用clientInboundChannel,它由SimpAnnotationMethodMessageHandler提供:

    @Bean
    public SimpAnnotationMethodMessageHandler simpAnnotationMethodMessageHandler() {
        SimpAnnotationMethodMessageHandler handler = createAnnotationMethodMessageHandler();
        handler.setDestinationPrefixes(getBrokerRegistry().getApplicationDestinationPrefixes());
    

    我想您可以为clientInboundChannel创建自己的SimpMessageTemplate实例,类似于BrokerMessageTemplatebean。你会没事的。

     类似资料:
    • 我想使用SpringBoot向ActiveMQ队列发送消息。应用程序应在发送后终止,但仍保持活动状态。 这是我的申请代码: 在没有任何父节点的情况下使用以下依赖项(Maven): 和一行

    • 我试图使用Feign.HeaderMap注释在rest请求中传递HTTP头的映射,但它们出现在主体中。

    • Helloc我试图使用Spring WebFlux创建webscoket终结点。我希望这个endpoint返回一些事件。 为了做到这一点,我创建了事件的ConnectableFlux,并在句柄(...)方法中将其映射到Flux。但是在我把它给WebSocket会话之后,什么都没有发生——webSocket会话客户端没有收到任何东西。但是同时println(event.toString()),你可以

    • 接口说明 轻推轻应用/订阅号支持发送文本、图片、文本卡片、图文、key-value、文件、待办等消息类型。本接口针对各种消息类型和发送的对象(单发、群发以及给部分人发送)进行了定义。 注:openid是用户关注某个轻应用/订阅号后生成的唯一id,单发和给部分人发送消息必须携带此参数,可以通过如下接口来获取: 根据qt_code获取用户基本信息 获取使用者列表 通过userId获取openid 消息

    • 主动发送消息 use EasyWeChat\Kernel\Messages\TextCard; // 获取 Messenger 实例 $messenger = $app->messenger; // 准备消息 $message = new TextCard([ 'title' => '你的请假单审批通过', 'description' => '单号:1928373, ...

    • 向已经创建连接凭据的设备发送消息数据。 请求方式: |4|2|3|message|\r 参数 message 发送的消息内容 返回值: "|4|2|3|1|\r" 发送成功 "|4|2|3|2|\r" 发送失败 Arduino样例: softSerial.print("|4|2|3|DFRobot|\r");