我想开发一个应用程序,我想将消息(或数据)从后端 Spring boot 应用程序推送到 UI。
我有以下要求 -
或者
考虑有一个正在运行的后台进程会生成事件,并且我们希望将这些事件推送到 UI。
为此,我遇到了可以在 Spring Boot 应用程序中使用的 WebSocket 组件。
但是,是否需要任何其他设置才能将传入数据推送到 UI?
任何帮助表示赞赏。
谢谢,
阿维纳什·德什穆克
我正在尝试在我的项目中使用该类SimpMessagingTemplate通过 websocket 发送一些数据。问题是我总是出错,这是完整的错误:
Error creating bean with name 'webSocketUserNotificationManagerImpl' defined in URL [...]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.messaging.simp.SimpMessagingTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Run Code Online (Sandbox Code Playgroud)
这是webSocketuserNotificationManagerImpl服务:
@Service
public class WebSocketUserNotificationManagerImpl implements UserNotificationManager {
/**
* Template to use to send back a message to the user via Web-socket.
*/
private SimpMessagingTemplate template;
public WebSocketUserNotificationManagerImpl(SimpMessagingTemplate template) {
this.template …Run Code Online (Sandbox Code Playgroud) 我在 Spring Boot 应用程序中使用 ws(非安全 WebSocket)。一旦客户端尝试连接到服务器,就会出现以下错误:
\nHandshake failed due to invalid Upgrade header: null
Spring Boot 应用程序在 Apache 代理后面的 Ubuntu 服务器上运行。Apache配置如下:
\n<VirtualHost *:80>\n DocumentRoot /var/www/myapp/public/\n ServerAdmin webmaster@localhost\n ServerName app.myapp.biz\n\n RewriteEngine On\n RewriteCond %{HTTP:Upgrade}^websocket$ [NC,OR]\n RewriteCond %{HTTP:Connection}^upgrade$ [NC]\n RewriteRule .* "ws:/127.0.0.1:8096/$1" [P,QSA,L]\n\n ProxyPreserveHost On\n ProxyRequests Off\n ProxyPass / http://127.0.0.1:8096/\n ProxyPassReverse / http://127.0.0.1:8096/\n RequestHeader set X-Forwarded-Proto http\n RequestHeader set X-Forwarded-Port 80\n\n SetEnv mongo_username aUser\n SetEnv mongo_password aPassword\n</VirtualHost>\nRun Code Online (Sandbox Code Playgroud)\n这application.properties的如下:
debug=false\nserver.port=8096\nserver.address=127.0.0.1\n\nserver.forward-headers-strategy=native\nserver.tomcat.use-relative-redirects=true\nserver.tomcat.remoteip.protocol-header=x-forwarded-proto\nserver.tomcat.remoteip.remote-ip-header=x-forwarded-for\nserver.tomcat.remoteip.port-header=x-forwarded-port\nRun Code Online (Sandbox Code Playgroud)\n当在我的开发机器上运行应用程序时,一切正常。一旦部署到服务器上就会出现上述错误。我\xe2\x80\x99已经用谷歌搜索了很多,但无法\xe2\x80\x99找到针对这个问题的具体内容。我希望有人能帮帮忙。
\n信息:尝试连接的前端应用程序是一个 Angular 应用程序,使用 …
我正在尝试回复未经身份验证的用户使用@SendToUser.
我正在使用新创建的Spring Boot应用程序,我唯一的配置是:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/user");
}
}
Run Code Online (Sandbox Code Playgroud)
控制器代码:
@MessageMapping("/search")
@SendToUser("/search")
public String search(@Payload String xxx) {
return "TEST1234";
}
Run Code Online (Sandbox Code Playgroud)
JS:
var socket = new SockJS('/webapp/stomp');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
stompClient.subscribe('/user/search', function(data){
alert(data.body);
});
});
Run Code Online (Sandbox Code Playgroud)
弹簧输出:
DEBUG org.springframework.web.servlet.DispatcherServlet: 996 - Successfully completed request
DEBUG o.s.w.s.handler.LoggingWebSocketHandlerDecorator: 45 - New WebSocketServerSockJsSession[id=shizav88]
DEBUG o.s.m.simp.broker.SimpleBrokerMessageHandler: 158 - …Run Code Online (Sandbox Code Playgroud) Spring Websocket 允许客户端(即浏览器)直接将消息发送到任何代理支持的目的地,即允许绕过服务器端应用程序进行直接的客户端到客户端通信。在现实世界中,我认为直接向消息代理公开公开写入访问权限是不可接受的。出于安全和消息完整性的原因,您通常希望只允许服务器应用程序通过代理向客户端发送任何消息。但我找不到任何有关如何实现这一目标的信息。默认行为是浏览器对代理目标具有不受限制的读+写直接访问权限。
我正在将现有的弹簧MVC Web应用程序与弹簧腹板集成在一起.我按照说明成功地整合了
https://spring.io/guides/gs/messaging-stomp-websocket/
现有的Web应用程序有一个过滤器,它设置了一些属性.我需要在@MessageMapping方法中访问控制器i中的过滤器设置的属性.
有人可以告诉我们如何在@MessageMapping方法中访问请求对象?
我的Java代码用URL/hello拦截所有调用(返回):
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
Run Code Online (Sandbox Code Playgroud)
我的JavaScript代码调用方法greeting()(Front):
function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何从Rest客户端调用@MessageMapping("/ hello")方法.我可以通过JavaScript代码连接,甚至可以获得响应并以HTML格式显示它.但我有一个要求,外部系统(通过休息调用)应该调用此@MessageMapping("/ hello"),然后应用程序(后端)应该发送对HTML的响应.我试图从chrome rest客户端插件调用@MessageMapping("/ hello")方法,但是没有成功.
请让我知道如何调用此方法?提前致谢
在我使用 Spring Websocket 的 Spring Boot 1.5 应用程序中,我想在方法的返回值上设置自定义 STOMP 标头@MessageMapping,但我不知道如何执行此操作。例如:
@Controller
public class ChannelController {
@MessageMapping("/books/{id}")
public Book receive(@DestinationVariable("id") Long bookId) {
return findBook(bookId);
}
private Book findBook(Long bookId) {
return //...
}
}
Run Code Online (Sandbox Code Playgroud)
当receive从客户端触发时STOMP SEND,我希望STOMP MESSAGE带有书体的回复框架有一个自定义标题:message-type:BOOK如下所示:
MESSAGE
message-type:BOOK
destination:/topic/books/1
content-type:application/json;charset=UTF-8
subscription:sub-0
message-id:0-7
content-length:1868
{
"createdDate" : "2017-08-10T10:40:39.256",
"lastModifiedDate" : "2017-08-10T10:42:57.976",
"id" : 1,
"name" : "The big book",
"description" : null
}
^@
Run Code Online (Sandbox Code Playgroud)
如何为 a 中的回复返回值设置 STOMP 标头@MessageMapping …
我希望能够检测到用户何时失去了与服务器的连接(关闭的选项卡、失去了互联网连接等)我在我的客户端上通过 Sockjs 使用 stompjs,在我的服务器上使用 spring mvc websockets。
我如何检测客户端何时失去连接。这是我如何配置我的 websocket 消息 brocket:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
private TaskScheduler scheduler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic").setHeartbeatValue(new long[]{10000, 10000}).setTaskScheduler(scheduler);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/web").setAllowedOrigins("*").withSockJS();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器类,它实际上处理传入的套接字消息:
@RestController
@CrossOrigin
public class WebMessagingController {
@MessageMapping("/chat/message")
public void newUserMessage(String json) throws IOException {
messagesProcessor.processUserMessage(json);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我使用从TextWebSocketHandler扩展的类,我将有 bean 能够覆盖在客户端连接和断开连接时调用的方法,但我认为这不适用于sock-js 客户端。谢谢你。
根据此处的文档https://tools.ietf.org/html/rfc6455#page-37,websocket必须ping使用pong.
我已经实现spring boot websocket处理websocket来自客户端的连接。
我有一个定期websocket发送的客户端ping frames。
我在这里/sf/answers/1710682991/发现我无法在 java 中处理 ping 消息。
我对此有疑问-
ping请求java spring-boot websocket吗?ping请求pong?我有 Python 客户端,它打开到服务器的 websocket 连接并使用 STOMP 协议订阅特定主题,订阅进行得很好,因为我在服务器上看到一切都很好。但是,当服务器发布一些消息时,客户端不会收到任何消息。以下是使用的代码:
客户
# coding: utf-8
import websocket
import stomp
import stomper
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInByaW5jaXBhbF9uYW1lIjoiYWRtaW4iLCJpc3MiOiJBdGhlbmEiLCJ1c2VydHlwZSI6IkxPQ0FMIiwiYW9zX3ZlcnNpb24iOiJldXBocmF0ZXMtNS4xMS1zdGFibGUiLCJyZWdpb24iOiJlbi1VUyIsImV4cCI6MTczNDI4MDI3NywidXVpZCI6ImI4MzhjOGRkLWI4NmQtNGNkZS05ZTE4LTUxM2E1OTk4ODhhYyIsImlhdCI6MTU3NjYwMDI3NywiYXV0aG9yaXRpZXMiOiJST0xFX0NMVVNURVJfQURNSU4sUk9MRV9NVUxUSUNMVVNURVJfQURNSU4sUk9MRV9VU0VSX0FETUlOLFJPTEVfQ0xVU1RFUl9WSUVXRVIiLCJqdGkiOiI1NTU1ZjEwZC04NGQ5LTRkZGYtOThhNC1mZmI1OTM1ZTQwZWEifQ.LOMX6ppkcSBBS_UwW9Qo2ieWZAGrKqADQL6ZQuTi2oieYa_LzykNiGMWMYXY-uw40bixDcE-aVWyrIEZQbVsvA"
headers = {"Authorization": "Bearer " + token}
uri = "ws://127.0.0.1:8765/notifications/websocket"
def on_msg(ws, msg):
print(msg)
def on_error(ws, err):
print(err)
def on_closed(ws):
print("#Closed#")
def on_open(ws):
sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto")
ws.send(sub)
headers = {"Authorization": "Bearer " + token}
websocket.enableTrace(True)
ws = websocket.WebSocketApp(uri, header=headers, on_message=on_msg, on_error=on_error, on_close=on_closed)
ws.on_open = on_open
ws.run_forever()
Run Code Online (Sandbox Code Playgroud)
代码服务器用于发布消息:
for (WatchesSubscription s : subscriptions) {
template.convertAndSendToUser(s.getSession().getUser(), destination, dto);
}
Run Code Online (Sandbox Code Playgroud)
当我检查上述变量的值时,我看到目的地是预期的 …
我使用spring websocket踩踏客户端。以下是代码片段?
List<Transport> transports = new ArrayList<Transport>(2);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
transports.add(new RestTemplateXhrTransport());
WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
headers.add("Cookie", client.getCookieString());
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new StringMessageConverter());
ListenableFuture<StompSession> future =
stompClient.connect(configuration.getApp().getWebsocketServerBase() + "/websocket/sa", headers, new MyWebSocketHandler());
future.addCallback(new SuccessCallback<StompSession>() {
public void onSuccess(StompSession stompSession) {
System.out.println("on Success!");
}
}, new FailureCallback() {
public void onFailure(Throwable throwable) {
System.out.println("on Failure!");
}
});
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是当websocket服务器关闭时,客户端不会收到该消息。
如何监听服务器关闭事件?
我将首先从我所知道的开始,因为它可能对其他人有用。
很明显,您可以使用协议子集实例化 SockJS:
sockJsProtocols = ["xhr-streaming", "xhr-polling", ....];
socket.cliente = new SockJS(url, null, {transports: sockJsProtocols}));
Run Code Online (Sandbox Code Playgroud)
我还发现,当 SockJS 调用 /info 端点时,服务器返回 websockets true 或 false(取决于服务器兼容性)。
我还知道这里有一个漂亮的表,有 3 列:websockets、流式传输和轮询。
但我有两个问题:
1) SockJS 如何决定轮询、流式传输还是 websocket?它不能与浏览器兼容性有关,因为我在日志中看到许多使用最新浏览器的 XHRStreaming 会话。怎么这在任何地方都没有记录?
2)为什么SockJS每次都需要调用/info?服务器的兼容性将始终相同。
spring-websocket ×13
spring ×9
java ×4
stomp ×4
websocket ×4
sockjs ×3
spring-boot ×3
spring-mvc ×3
angular ×1
apache ×1
ping ×1
python ×1
rest-client ×1
stompjs ×1