我有以下情况:
var options = {
protocols_whitelist : [ "websocket", "xhr-streaming", "xdr-streaming", "xhr-polling", "xdr-polling", "iframe-htmlfile", "iframe-eventsource", "iframe-xhr-polling" ],
debug : false
};
var socket = new SockJS("/mmyurl/",undefined,options);
var stompClient = Stomp.over(socket);
stompClient.connect({
company : "XXXXX"
}, function(frame) {
stompClient.subscribe('/topic/mytopic', function(message){
var myitem = JSON.parse(message.body);
});
Run Code Online (Sandbox Code Playgroud)
一切正常,问题是在javascript控制台上充满了这样的调试消息:
<<< MESSAGE
content-type:application/json;charset=UTF-8
subscription:sub-1
message-id:o6g660dt-113
destination:/topic/mytopic
content-length:411
Run Code Online (Sandbox Code Playgroud)
我想禁用这些消息.
我试图改变一些选项,并试图简单地注册:
var socket = new SockJS("/mmyurl/");
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
有没有办法禁用调试消息?
任何帮助表示赞赏
我有,我认为是一个非常简单的Spring WebSocket应用程序.但是,我正在尝试使用路径变量进行订阅以及消息映射.
我在下面发布了一个释义的例子.我希望@SendTo注释能够根据用户返回给订阅者fleetId.即POST以/fleet/MyFleet/driver/MyDriver应通知用户/fleet/MyFleet,但我没有看到这种行为.
值得注意的是订阅文字/fleet/{fleetId}作品.这是有意的吗?我错过了一些配置吗?或者这不是它的工作原理吗?
我对WebSockets或Spring项目不是很熟悉,所以提前谢谢.
Controller.java
...
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
return new Simple(fleetId, driverId);
}
...
Run Code Online (Sandbox Code Playgroud)
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/live");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/fleet").withSockJS();
}
}
Run Code Online (Sandbox Code Playgroud)
的index.html
var socket = new SockJS('/fleet');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
// Doesn't Work
stompClient.subscribe('/topic/fleet/MyFleet', …Run Code Online (Sandbox Code Playgroud) 是否可以向特定会话发送消息?
我在客户端和Spring servlet之间有一个未经验证的websocket.当异步作业结束时,我需要向特定连接发送未经请求的消息.
@Controller
public class WebsocketTest {
@Autowired
public SimpMessageSendingOperations messagingTemplate;
ExecutorService executor = Executors.newSingleThreadExecutor();
@MessageMapping("/start")
public void start(SimpMessageHeaderAccessor accessor) throws Exception {
String applicantId=accessor.getSessionId();
executor.submit(() -> {
//... slow job
jobEnd(applicantId);
});
}
public void jobEnd(String sessionId){
messagingTemplate.convertAndSend("/queue/jobend"); //how to send only to that session?
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在此代码中看到的,客户端可以启动异步作业,当它完成时,它需要结束消息.显然,我只需要向申请人发送信息而不是向所有人广播.有一个@SendToSession注释或messagingTemplate.convertAndSendToSession方法会很棒.
UPDATE
我试过这个:
messagingTemplate.convertAndSend("/queue/jobend", true, Collections.singletonMap(SimpMessageHeaderAccessor.SESSION_ID_HEADER, sessionId));
Run Code Online (Sandbox Code Playgroud)
但这会向所有会话广播,而不仅仅是指定的会话.
更新2
使用convertAndSendToUser()方法进行测试.这个测试是和正式的Spring教程的破解:https://spring.io/guides/gs/messaging-stomp-websocket/
这是服务器代码:
@Controller
public class WebsocketTest {
@PostConstruct
public void init(){
ScheduledExecutorService statusTimerExecutor=Executors.newSingleThreadScheduledExecutor();
statusTimerExecutor.scheduleAtFixedRate(new Runnable() …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Websocket和STOMP,Simple Message Broker.在我的@Controller使用方法级别@SubscribeMapping,它应该将客户端订阅到主题,以便客户端之后将接收该主题的消息.假设客户订阅主题"聊天":
stompClient.subscribe('/app/chat', ...);
当客户订阅"/ app/chat "而不是"/ topic/chat"时,此订阅将转到使用以下方法映射的方法@SubscribeMapping:
@SubscribeMapping("/chat")
public List getChatInit() {
return Chat.getUsers();
}
Run Code Online (Sandbox Code Playgroud)
这是Spring ref.说:
默认情况下,@ SubsscribeMapping方法的返回值作为消息直接发送回连接的客户端,并且不通过代理.这对于实现请求 - 回复消息交互很有用; 例如,在初始化应用程序UI时获取应用程序数据.
好的,这就是我想要的,但只是部分 !! 订阅后发送一些init-data,好吧.但订阅呢?在我看来,这里发生的事情只是一个请求 - 回复,就像一个服务.订阅只是消费.如果是这种情况,请澄清我.
如果在这里客户端没有订阅任何地方,我想知道为什么我们称之为"订阅"; 因为客户端只收到一条消息而不是后续消息.
编辑:
为了确保订阅已经实现,我尝试的内容如下:
服务器端:
组态:
@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();
} …Run Code Online (Sandbox Code Playgroud) spring stomp messagebroker spring-messaging spring-websocket
我想了解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 websocket stomp服务器可以根据sessionId断开客户端(或者真的基于任何东西)?
在我看来,一旦客户端连接到服务器,没有任何东西允许服务器断开客户端.
我正在开展一个涉及实时聊天(消息传递,包括群聊)的项目.
之前我曾经使用过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进行微服务.
stomp ×10
spring ×6
java ×4
websocket ×4
sockjs ×2
spring-boot ×2
javascript ×1
socks ×1
spring-mvc ×1
tomcat ×1
xmpp ×1