Solon v3.0.1

solon-net-stomp

</> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-net-stomp</artifactId>
    <version>3.0.2-M7</version>
</dependency>

1、描述

网络扩展插件。提供基础的 stomp-broker 支持。插件提供三个关键的类:

说明
StompBroker将 WebSocket 协议,转为 Stomp 协议;并提供 Broker 服务
StompEmitterStomp 消息发射器(用于发消息)
ToHandlerStompListener将 Stomp 事件转为 Solon Handler 通用体系。从而实现控制器模式开发

2、使用示例

  • 注册经理人
@ServerEndpoint("/chat")
public class ChatStompBroker extends StompBroker {
    public ChatStompBroker(){
        //转发到 Solon Handler 体系
        this.addServerListener(new ToHandlerStompListener(getServerSender()));
        
        //添加签权监听器(按需添加)
        this.addServerListener(new ChatStompListenerImpl());
    }
}

//签权演示(按需定制)
public class ChatStompListenerImpl extends SimpleStompListener {
    @Override
    public void onOpen(WebSocket socket) {
        String user = socket.param("user");
        if (user == null) {
            socket.close();
        }
    }
}
  • 业务场景应用(经典的 MVC 模式,与 http 请求差不多)
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Http;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Message;
import org.noear.solon.annotation.To;

@Controller
public class TestController {
    @Inject //@Inject("/chat") 多经纪人时,指定名字
    StompEmitter stompEmitter;

    @Message
    @Mapping("/hello")
    @To("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }

    @Message
    @Mapping("/topic/greetings")
    public Greeting greeting2(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        //log.info ("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }

    @Http
    @Mapping("/hello2")
    public void greeting3(Context ctx, HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay

        String payload = ctx.renderAndReturn(new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"));
        stompEmitter.sendTo("/topic/greetings", payload);
    }
}

3、注解使用说明

Mapping 说明(当有路径匹配上时)

  • 没有 “方式限定”(@Http@Get@Message..)时,@Mapping 表示匹配所有的请求。
  • 添加 @Message 时,表示只匹配 ctx.method() == 'MESSAGE' 的请求
  • 添加 @Http 时,表示匹配 ctx.method() == 'GET' | 'POST'.. 等 Http 的上下文
  • 可以添加多个 “方式限定” 注解

Message 说明

  • @Get 之类的一样,表过请求方式限定

To 说明

  • 表示处理结果,转发给另一个目标

更多,参考:《@Mapping 用法说明》

4、注解组合说明

组合示例说明
@Message @Mappinge("/demo") void fun()接收所有处理
@Message @Mappinge("/demo") String fun()接收所有处理,并将处理结果转发给来源地址
@Message @Mappinge("/demo") @To("/test") String fun()接收所有处理,并将处理结果转发给目标地址