gpt4 book ai didi

java - SpringWebSockets 不从服务器发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:59 25 4
gpt4 key购买 nike

您好,我遇到了 Spring Websockets 的问题,情况如下:

一个独立的应用程序正在发送(远程)一些数据,例如日期 Date、过程字符串和重量 BigDecimal,该数据通过 TCP 发送到套接字,

此数据保存到数据库后,此时一切都很好,但在下一步(websocket)中我无法在网页中显示此信息,重量数据必须在屏幕上显示(实时)

这是我的 websocket 配置:

import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("/indicator").withSockJS();
}

@Override
public void configureClientInboundChannel(final ChannelRegistration registration) {
}

@Override
public void configureClientOutboundChannel(final ChannelRegistration registration) {
}

@Override
public void configureMessageBroker(final MessageBrokerRegistry registry) {

}

@Override
public void configureWebSocketTransport(WebSocketTransportRegistration wstr) {

}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {

}

@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {

}

@Override
public boolean configureMessageConverters(List<MessageConverter> list) {
return Boolean.TRUE;
}

}

这是我的另一个类,它从套接字接收数据并处理信息并发送到 websocket:

import com.mcss.mcontrols.helper.ByteHelper;
import com.spc.basweb.Constants;
import com.spc.basweb.transmissor.dto.Transmission;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.messaging.core.MessageSendingOperations;
import org.springframework.messaging.simp.broker.BrokerAvailabilityEvent;
import com.spc.basweb.service.BroadcastingService;
import com.spc.basweb.service.DataProcessorService;
import java.io.IOException;
import org.springframework.integration.annotation.MessageEndpoint;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;

@MessageEndpoint
public class BroadcastingServiceImpl implements BroadcastingService, ApplicationListener<BrokerAvailabilityEvent> {

private static final Logger LOGGER = Logger.getLogger(BroadcastingServiceImpl.class);
private final MessageSendingOperations<String> messagingTemplate;
private String processedData;

@Autowired
DataProcessorService dataProcessorService;

@Autowired
public BroadcastingServiceImpl(final MessageSendingOperations<String> messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}

@Override
public String getProcessedData() {
return processedData;
}

@Override
@ServiceActivator(inputChannel = "broadcaster")
public String broadcast(byte[] bytes) {
try {
Transmission t = (Transmission) ByteHelper.toObject(bytes);
LOGGER.debug(t.getProcedence() + " " + t.getDate() + " " + t.getWeight());
String rm = this.dataProcessorService.processData(t);
this.messagingTemplate.convertAndSend(Constants.END_POINT_READ, this.dataProcessorService.getWeighing().getWeight().toString());
return rm;
} catch (IOException | ClassNotFoundException ex) {
LOGGER.error("Error de transmision de objetos", ex);
}
return DataProcessorService.NOT_OK_RESPONSE;
}

@Override
public void onApplicationEvent(BrokerAvailabilityEvent e) {
LOGGER.debug("Application event");
}

@Transformer(outputChannel = "broadcaster")
public String convert(String response) {
return response;
}
}

在调试器中我得到以下信息:

30-03-2016 15:07:20 DEBUG SimpleBrokerMessageHandler:277 - Processing MESSAGE destination=/read session=null payload=3003

在另一个类( Controller )中我使用相同的方法:

this.messagingTemplate.convertAndSend(Constants.END_POINT_READ, "3500");

并“手动”发送正确显示的信息。我在调试器中收到此消息:

30-03-2016 15:05:18 DEBUG SimpleBrokerMessageHandler:277 - Processing MESSAGE destination=/read session=dfR45V77 payload=3500

区别在于 session 值,但我不知道此 session 在此过程中为空,我做错了什么,欢迎澄清或帮助

最佳答案

首先,我没有看到 configureMessageBroker 实现,因此不清楚它是如何工作的......

从另一方面来说,如果您看到这样的差异,请尝试调试 SimpMessagingTemplate 中的代码。

当它出现时,我只在 SimpleBrokerMessageHandler 中看到 headerAccessor.setSessionId(sessionId);

 logger.debug("Broadcasting to " + subscriptions.size() + " sessions.");

关于java - SpringWebSockets 不从服务器发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com