在我们当前的应用程序中,我们以这种方式使用Spring AMQP:
<rabbit:connection-factory id="cachingConnectionFactory"
username="${rabbitmq.connection.username}"
password="${rabbitmq.connection.password}"
host="${rabbitmq.connection.host}"
port="${rabbitmq.connection.port}"
executor="rabbitmqPoolTaskExecutor"
requested-heartbeat="${rabbitmq.connection.requested-heartbeat}"
channel-cache-size="${rabbitmq.connection.channel-cache-size}"
virtual-host="${rabbitmq.connection.virtual-host}" />
<rabbit:admin id="adminRabbit"
connection-factory="cachingConnectionFactory"
auto-startup="true" />
<rabbit:template id="rabbitTemplate"
connection-factory="cachingConnectionFactory"
exchange="v1.general.exchange"
message-converter="jsonMessageConverter"
encoding="${rabbitmq.template.encoding}"
channel-transacted="${rabbitmq.template.channel-transacted}" />
<rabbit:queue id="v1.queue.1" name="v1.queue.1" />
<rabbit:queue id="v1.queue.2" name="v1.queue.2" />
<rabbit:queue id="v1.queue.3" name="v1.queue.3" />
<fanout-exchange name="v1.general.exchange" xmlns="http://www.springframework.org/schema/rabbit" >
<bindings>
<binding queue="v1.queue.1" />
<binding queue="v1.queue.2" />
<binding queue="v1.queue.3" />
</bindings>
</fanout-exchange>
<listener-container xmlns="http://www.springframework.org/schema/rabbit"
connection-factory="cachingConnectionFactory"
message-converter="jsonMessageConverter"
task-executor="rabbitmqPoolTaskExecutor"
auto-startup="${rabbitmq.listener-container.auto-startup}"
concurrency="${rabbitmq.listener-container.concurrency}"
channel-transacted="${rabbitmq.listener-container.channel-transacted}"
prefetch="${rabbitmq.listener-container.prefetch}"
transaction-size="${rabbitmq.listener-container.transaction-size}" >
<listener id="v1.listener.queue.1" ref="listener1" method="handleMessage" queues="v1.queue.1" />
<listener id="v1.listener.queue.2" ref="listener2" method="handleMessage" queues="v1.queue.2" />
<listener id="v1.listener.queue.3" ref="listener3" …Run Code Online (Sandbox Code Playgroud) 找不到与此特定错误相关的任何其他问题.
我似乎无法用RabbitMQ连接我的Spring Boot WebSocket演示项目.请注意,使用"简单"代理时一切正常,但是当使用Rabbit连接stomp代理时,我收到以下错误(继续尝试重新连接):
Java HotSpot(TM) Client VM warning: You have loaded library /tmp/libnetty-transport-native-epoll8916930274033685449.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
2016-03-07 22:35:13.993 INFO 4047 --- [ main] o.s.m.s.s.StompBrokerRelayMessageHandler : Started.
2016-03-07 22:35:14.045 INFO 4047 --- [eactor-tcp-io-1] r.io.net.impl.netty.tcp.NettyTcpClient : CONNECTED: [id: 0x034a269f, /127.0.0.1:39955 => /127.0.0.1:25672]
2016-03-07 22:35:14.151 INFO 4047 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer …Run Code Online (Sandbox Code Playgroud) rabbitmq spring-boot spring-websocket java-websocket spring-rabbitmq
我需要向 STOMP 消息添加标头,目前它的工作方式如下,但我正在重新创建消息,是否可以只添加本机标头而不必重新创建消息以提高性能。
public class MyChannelInterceptor extends ChannelInterceptorAdapter {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
StompCommand command = accessor.getCommand();
if(command != null) {
log.debug("Receiving msg {} from {}",command,accessor.getUser().getName());
if(command == StompCommand.SEND) {
log.debug("Adding expires header to msg {} from {}",command,accessor.getUser().getName());
String ttlString = accessor.getFirstNativeHeader("ttl");
long ttl = 30000;
try {
ttl = Long.parseLong(ttlString);
}
catch(Exception ex) {
log.error("TTL header received but not in correct format {}",ttlString);
}
accessor.addNativeHeader("expires", Long.toString(System.currentTimeMillis() + ttl));
return MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders()); …Run Code Online (Sandbox Code Playgroud) 我在网页中的 SockJs 客户端发送帧大小为 16K 的消息。消息大小限制决定了我可以传输的文件的最大大小。
以下是我在文档中找到的内容。
/**
* Configure the maximum size for an incoming sub-protocol message.
* For example a STOMP message may be received as multiple WebSocket messages
* or multiple HTTP POST requests when SockJS fallback options are in use.
*
* <p>In theory a WebSocket message can be almost unlimited in size.
* In practice WebSocket servers impose limits on incoming message size.
* STOMP clients for example tend to split large messages around 16K
* …Run Code Online (Sandbox Code Playgroud) 我有一个Spring Websocket Stomp应用程序,它接受SUBSCRIBE请求.
在应用程序中,我有一个SUBSCRIBE的处理程序,即
@Component
public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {
@Override
public void onApplicationEvent(SessionSubscribeEvent event) {}
}
Run Code Online (Sandbox Code Playgroud)
我用来验证订阅.
如果订阅无效,例如,当前用户看不到该订阅,我希望Broker(我使用SimpleMessagingBroker)"忘记"该订阅,或者最好不要注册它.
我的问题是:
如果我将订阅请求的处理移动到传入的消息拦截器并停止消息传播,我可以让Broker不注册订阅吗?
还有什么可以从这个事件处理程序中取消订阅?
我已经使用 spring 实现了以下 Web-Socket-Server。我们不想使用 STOMP 和 JSocks。
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketServerHandler(), "/websocket/user/{userId}");
}
}
@Service
public class WebSocketServerHandler extends TextWebSocketHandler {
private List<WebSocketSession> sessions = new ArrayList<WebSocketSession>();
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message)
throws Exception {
session.sendMessage(message);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions = null;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以从前端客户端(浏览器)成功连接到该 Web-Socket-Server。现在我想在运行时从我的一些 java 类连接到那个 Web-Socket-Server,然后想向那个 …
我有一个使用 Spring MVC 和 Security 的应用程序。我尝试向其中添加 Websocket。我已经成功连接,但是,当我尝试向后端发送消息时 - 什么也没发生。在调试模式下用@MessageMapping 注释的方法根本达不到!我不知道为什么。我已经尝试了很多谷歌解决方案,所以现在所有的配置都是下一个:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
public WebSocketConfig() {
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello1").withSockJS();
}
}
Run Code Online (Sandbox Code Playgroud)
我还为 websockets 添加了安全配置
@Configuration
public class SecuritySocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
protected boolean sameOriginDisabled() {
return true;
}
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages.simpDestMatchers("/hello1").authenticated().simpDestMatchers("/app/hello1").authenticated();//permitAll();
}
}
Run Code Online (Sandbox Code Playgroud)
控制器类
@Controller
public class WebsocketController {
@MessageMapping("/hello1")
public void send(Message message) {
String name = …Run Code Online (Sandbox Code Playgroud) 对于我的仪表板应用程序,我想使用内部 Spring 指标监控基于 Spring Boot 的应用程序。因此,我使用了spring-boot-actuator暴露许多内部指标的依赖项。有很多基于 HTTP 的指标和 Tomcat 指标,例如当前会话、状态 X 的 HTTP 调用量等。我找不到有关我的 Websocket 连接的任何信息。
是否有任何内置的现成指标公开工具用于当前的 Websocket 与 Spring 或我是否必须创建自己的指标(例如,用于使用 Prometheus 在 Grafana 中显示数据)并且必须手动注册例如一个计数器当我收到SessionConnectEvent或SessionConnectEvent?
提前致谢!
我正在尝试在不使用STOMP的情况下在Spring中实现WebSocket服务器,请阅读以下文章:http://www.devglan.com/spring-boot/spring-websocket-integration-example-without-stomp
WebSocketConfig.java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired private WebSocketHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/app");
}
}
Run Code Online (Sandbox Code Playgroud)
WebSocketHandler
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我在启动时遇到此异常:
java.lang.IllegalStateException: Unexpected use of scheduler.
at org.springframework.web.socket.config.annotation.WebSocketConfigurationSupport$NoOpScheduler.schedule(WebSocketConfigurationSupport.java:108) ~[spring-websocket-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.scheduleCronTask(ScheduledTaskRegistrar.java:414) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.scheduleTasks(ScheduledTaskRegistrar.java:352) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:332) …Run Code Online (Sandbox Code Playgroud) spring-websocket ×10
java ×5
spring ×4
spring-boot ×3
websocket ×3
stomp ×2
fiddler ×1
https ×1
metrics ×1
rabbitmq ×1
sockjs ×1
spring-4 ×1
spring-mvc ×1