我真的很喜欢 @SubscribeMapping 方法来使用 STOMP-over-Websocket 实现类似 RPC 的语义。
不幸的是,它的“魔法”要求带注释的方法返回一个值。但是,如果返回值不容易获得怎么办?我想避免在等待它的方法内部阻塞。相反,我想传递一个回调,该回调将在它准备好时发布一个值。我想我可以在回调中使用消息模板的 convertAndSendToUser() 来做到这一点。事实证明@SubscribeMapping 处理非常特殊,并且对于 SimpMessageSendingOperations 的实例是不可能的。
我可以通过在 SubscriptionMethodReturnValueHandler 上调用 handleReturnValue() 来实现我的目标,但是如果不是 hackish(比如向 handleReturnValue() 提供 MethodParameter 的虚拟实例),那么它的整体机制就会非常乏味:
public class MessageController {
private final SubscriptionMethodReturnValueHandler subscriptionMethodReturnValueHandler;
@Autowired
public MessageController(SimpAnnotationMethodMessageHandler annotationMethodMessageHandler) {
SubscriptionMethodReturnValueHandler subscriptionMethodReturnValueHandler = null;
for (HandlerMethodReturnValueHandler returnValueHandler : annotationMethodMessageHandler.getReturnValueHandlers()) {
if (returnValueHandler instanceof SubscriptionMethodReturnValueHandler) {
subscriptionMethodReturnValueHandler = (SubscriptionMethodReturnValueHandler) returnValueHandler;
break;
}
}
this.subscriptionMethodReturnValueHandler = subscriptionMethodReturnValueHandler;
}
@SubscribeMapping("/greeting/{name}")
public void greet(@DestinationVariable String name, Message<?> message) throws Exception {
subscriptionMethodReturnValueHandler.handleReturnValue("Hello " + name, new MethodParameter(Object.class.getMethods()[0], -1), message);
}
}
所以我的问题很简单:有没有更好的方法?