我使用 Spring 4.3.5 和 WebSocket 以及 SockJS、STOMP 和 SimpleBrokerMessageHandler。
在我的应用程序中,我有三个单独的 WebSocket 端点在不同的地址上运行:/endPointA、/ednpointB、/endpointC 更具体地说,我有三个单独的配置类,并用 @Configuration @EnableWebSocketMessageBroker 注释进行注释。
我还有一个具有 @Autowired SimpMessagingTemplate 的类。
最后,我有三个客户端,每个客户端都连接到一个不同的端点。然而,所有这些都订阅了“相同”的频道地址,即/topic/messages
当我使用SimpMessagingTemplate向/topic/messages发送内容时,所有客户端都会收到此消息。
之后我有两个问题:
我做了一些调查(堆转储分析),发现对于我的配置,我有:
所以我想知道,在所有端点上的消息传播是否是 SimpleBrokerMessageHandler 或 SimpMessagingTemplate 的“功能”。
我正在尝试通过 LambdaMetafactory 动态创建 BiConsumer 类型的方法引用。我试图应用在https://www.cuba-platform.com/blog/think-twice-before-using-reflection/上找到的两种方法 - createVoidHandlerLambda 和这里Create BiConsumer as Field setter 而不反映Holger 的答案。
但是在这两种情况下我都遇到以下错误:
Exception in thread "main" java.lang.AbstractMethodError: Receiver class org.home.ref.App$$Lambda$15/0x0000000800066040 does not define or inherit an implementation of the resolved method abstract accept(Ljava/lang/Object;Ljava/lang/Object;)V of interface java.util.function.BiConsumer.
at org.home.ref.App.main(App.java:20)
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的:
public class App {
public static void main(String[] args) throws Throwable {
MyClass myClass = new MyClass();
BiConsumer<MyClass, Boolean> setValid = MyClass::setValid;
setValid.accept(myClass, true);
BiConsumer<MyClass, Boolean> mappingMethodReferences = createHandlerLambda(MyClass.class);
mappingMethodReferences.accept(myClass, true);
}
@SuppressWarnings("unchecked")
public …Run Code Online (Sandbox Code Playgroud)