我想了解convertAndSendToUser如何在Spring SockJS + Websocket框架中工作.
在客户端,我们将连接为
stompClient.connect(login, password, callback())
Run Code Online (Sandbox Code Playgroud)
这将导致连接请求与登录和密码的"Stomp凭证",例如,如果我们处理SessionConnectEvent http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in -spring-4 /
但我仍然不清楚这是否是服务器端向队列发送操作的"用户":
simpMessagingTemplate.convertAndSendToUser(username, "/queue/reply", message);
Run Code Online (Sandbox Code Playgroud)
我能得到的最接近的是阅读这个帖子向Spring Websocket上的特定用户发送消息,由Thanh Nguyen Van回答,但目前还不清楚.
基本上我需要做的是订阅一些客户端到同一主题,但在服务器上,发送不同的数据.客户可以提供用户标识符.
在我们当前的应用程序中,我们使用Spring Websockets而不是STOMP.我们希望横向扩展.是否有关于如何处理多个tomcat实例上的websocket流量的最佳实践以及如何在多个节点上维护会话信息.是否有一个可以参考的工作样本?
我已经搜索了很多并且无法找到这个:有没有办法让一个spring websocket stomp服务器可以根据sessionId断开客户端(或者真的基于任何东西)?
在我看来,一旦客户端连接到服务器,没有任何东西允许服务器断开客户端.
我尝试使用带有websocket的Spring.我开始使用本教程进行调查.
在我的客户端,我有类似的东西来初始化与服务器的连接:
function connect() {
var socket = new SockJS('/myphotos/form');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
}
Run Code Online (Sandbox Code Playgroud)
它很棒,在我的控制器中我可以在下面的类中完成我的过程:
@Controller
@RequestMapping("/")
public class PhotoController {
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
return new Greeting("Hello world !");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想做的是让一个线程向客户端发送消息,收听"/ topic/greeting".我写了这样的Runnable类:
public class FireGreeting implements Runnable {
private PhotoController listener;
public FireGreeting(PhotoController listener) {
this.listener = listener;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep( …Run Code Online (Sandbox Code Playgroud) 我正在开展一个涉及实时聊天(消息传递,包括群聊)的项目.
之前我曾经使用过websockets,所以我开始使用spring-websockets开始研究它,我做了一些关于实现它的最佳方法的阅读.然后我遇到了STOMP(作为websockets的子协议),因为在春天有直接支持STOMP,所以我很容易实现我应该做的事情.
但我的疑问是,就我的理解STOMP和XMPP是类似的协议(消息传递协议),但我找不到任何问题/博客,其中差异被解释,为什么有人会更喜欢一个?
如果有人解释这两个协议有何不同,那将会非常有用吗?
谢谢.
我收到了一个Web应用程序,使用Spring通过WebSockets Messaging使用STOMP实现,类似于此处描述的(在后端使用RabbitMQ).它在Tomcat上运行,我可以使用常规URL连接到应用程序(例如http://host/server/).我还获得了一个演示客户端 - 一个JSPX页面,它使用了Modernizr WebSockets和SockJS.demo客户端中的连接代码如下所示:
if (Modernizr.websockets) {
socket = new WebSocket('ws://host/server/endpointx');
}
else {
socket = new SockJS('/server/endpointy');
}
stompClient = Stomp.over(socket);
stompClient.connect(headers, function(frame) { ... });
....
Run Code Online (Sandbox Code Playgroud)
演示客户端工作正常(当我在浏览器中加载JSPX页面时,我可以连接到服务器).但我的目标是使用一些Java STOMP库连接到同一台服务器.问题是,我尝试过的库需要主机和端口作为连接参数:例如,使用ActiveMQ Stomp库:
StompConnection connection = new StompConnection();
connection.open("host", port);
connection.connect(new HashMap<String, String>());
Run Code Online (Sandbox Code Playgroud)
如果我指定port为61613,连接成功,但我直接打了RabbitMQ,而不是我的服务器(这不是我想要的).如果我指定8080(或80),在连接时我得到一个错误
位于org.apache.activemq.transport.stomp.StompConnection的org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:137)java.io.DataInputStream.readByte(未知来源)的java.io.EOFException .receive(StompConnection.java:77)org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:68)atg.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:139) )at .... stomp.impl.activemq.ActiveMQStompDriver.connect(ActiveMQStompDriver.java:39)... 25更多
和跟踪显示这是因为CONNECT帧永远不会收到预期的CONNECTED帧(事实上,它不会收到任何回复).
所以我很困惑:我使用了错误的端口吗?或处理一些库不兼容?或者我是否需要以某种方式指示Tomcat我想要将HTTP连接升级到WebSockets?
如果上面的问题很难回答,那么这个问题同样有用:如何通过使用Java在Tomcat上运行的WebSockets消息通道上的STOMP连接到Spring应用程序?
我已经有了一个SimpleBrokerWebsocket实现.现在我正在迁移到基于微服务的架构,并尝试将消息传递作为单独的微服务.
为了避免破坏现有的客户端部署并逐步转向完整的基于微服务的架构,我希望我的旧套接字端点重定向到微服务提供的新套接字端点.
所以我需要一些想法,如何处理身份验证和向正确的用户发送消息.
此外,我想知道如何为这个要求的架构.我想使用StompBrokerRelay进行微服务.
当使用Spring Websockets创建类似聊天应用程序的东西时,了解所有订阅任何给定主题的人都很有用.例如,用于在客户端中显示的在线数据.
我知道我可以实现ApplicationListener并保留我自己的"连接用户"列表,但似乎库必须已经在做这项工作.
什么是直接从库中获取活动订阅信息的推荐方法(并且不在内存或数据库中维护我自己的列表).
我正在使用Spring websockets(STOMP作为子协议)和Sockjs开发消息传递应用程序.
我应该提供支持来发送消息中的文件.
根据这张票,sockjs不支持二进制数据,但STOMP确实如此.
我知道我们可以将图像转换为base64并通过stomp发送它,但我认为这不是最好的做法,因为有很多转换和开销.此外,我必须保存消息,所以要再次在服务器上保存这个base64编码文件我将不得不解码它们.
我有几个问题:
1)是否有通过sockjs + stomp发送图像/文件或转换为Base64的解决方法是唯一的方法?
2)这可能是一个非常愚蠢的问题,但根据这个问题,可以通过STOMP发送二进制数据(没有sockjs).没有sockjs支持后备有多难?
谢谢.
编辑:如果使用base64是唯一的选择,我宁愿发出POST请求来保存具有附件的消息,而不是使用base64编码.任何更好的想法?
我在Spring中实现了WebSocket.一切正常,但最近我决定实施Spring Security.
我的MessageBroker看起来像:
@Configuration
@EnableWebSocketMessageBroker
@Component("messageBroker")
public class MessageBroker implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/graphs").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
}
@Override
public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
}
@Override
public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {
}
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
messageConverters.add(new MappingJackson2MessageConverter());
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我的JS客户端看起来很喜欢这个:
var socket = new SockJS('/server/graphs');
var client = Stomp.over(socket);
client.connect({}, function (frame) {
client.subscribe("/data", function (message) {
console.log('GET MESSAGE :' + message.body);
var test = JSON.parse(message.body); …Run Code Online (Sandbox Code Playgroud) spring stomp spring-security spring-messaging spring-websocket
spring-websocket ×10
stomp ×8
spring ×7
sockjs ×3
java ×2
spring-boot ×2
javascript ×1
spring-mvc ×1
tomcat ×1
websocket ×1
xmpp ×1