当前位置: 首页 > 知识库问答 >
问题:

如何在Spring应用程序侦听器(SessionConnectedEvent)中发送消息

戚英逸
2023-03-14

我在Spring消息中使用Stomp over SockJS。我正在尝试在连接新用户时向所有登录用户发送消息。首先,这是我的听众:

@Component
public class SessionConnectedListener implements ApplicationListener<SessionConnectedEvent> {

    private static final Logger log = LoggerFactory.getLogger(SessionConnectedListener.class);

    @Autowired
    private SimpMessagingTemplate template;

    @Override
    public void onApplicationEvent(SessionConnectedEvent event) {
        log.info(event.toString());

        // Not sure if it's sending...?
        template.convertAndSend("/topic/login", "New user logged in");
    }

}

我的WebSocket配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
    }

}

我的JS配置

var socket = new SockJS('/chat');
stompClient = Stomp.over(socket);

stompClient.connect({}}, function(frame) {

    // ... other working subscriptions

    stompClient.subscribe("/topic/login", function(message) {
        console.log(message.body);
    });

});

我在这里的问题是,我的template.convert和发送()在应用程序监听器中不工作。但是,如果我把它放在一个带有@Message映射注释的Controller方法中,它将工作,并且我将有一个控制台日志客户端。

所以我的问题是:template.convert和发送()可以在应用程序监听器中工作吗?如果有,如何?还是我错过了什么?

谢谢你的帮助!

附:我的日志。信息(event.toString());在ApplicationListener中工作,因此我知道我正在进入onApplicationEvent()方法。

共有2个答案

澹台衡
2023-03-14

好的。虽然很奇怪,但我把我的监听器放在了下面的包里:

包my.company.listener

但是由于我在应用程序上下文中的配置,convertAndSend()方法无法工作。

@ComponentScan(basePackages={“my.company”},excludeFilters=@ComponentScan.Filter(type=FilterType.REGEX,pattern={“my.company.web.*}))

然而,当我将我的监听器(用@Component注释)移动到web子包时,它工作了!

打包我的。公司网状物听众

狄易安
2023-03-14

ApplicationListener中使用模板发送消息应该可以正常工作。请查看这个SpringWebSocket聊天示例。

 类似资料:
  • 我需要在一定的持续时间后将消息发送给MessageListener,所以有没有任何方法可以使用SpringAMQP实现。 如。Producer生成消息并将消息发送到RabbitMQ Q,该消息立即被侦听器接收到,我想延迟消费者端接收到的消息,比如说在一些配置参数(比如1000ms)之后

  • 我使用spring amqp和rabbitmq在我的应用程序中交换消息。一旦我的应用程序启动,我将在我的tomcat控制台中不断看到大量的消息监听日志。我想禁用。怎么做? 下面是我的log4j配置。尽管我只提到了文件appender,但所有侦听器日志都在我的应用服务器控制台中打印。 需要添加任何配置吗? 编辑帖子: 我添加了在JAVA_OPTS中。请在下面找到日志。 我的项目结构如下所示。 项目结

  • 我试图在我的Spring Boot应用程序中实现反应性kafka消费者,我正在看这些例子:https://github.com/reactor/reactor-kafka/blob/master/reactor-kafka-samples/src/main/java/reactor/kafka/samples/SampleScenarios.java 看起来在被动Kafka中还没有对Spring的

  • 我已经使用Spring Kafka创建了一个Kafka消费者,并将其部署在云铸造中。该主题有10个分区。我计划将应用程序扩展到10个实例,以便每个实例可以使用来自一个分区的消息。Spring Kafka支持并发消息侦听器容器,我猜它支持从每个分区创建多个线程来使用。例如,如果我有5个消费者实例,每个消费者实例可能有2个线程从分区消耗。因为我计划为每个分区创建一个应用实例,所以使用并发消费者有什么好

  • 我试图在我的基于微服务的Spring启动应用程序中实现普罗米修斯,部署在weblogic服务器上。作为POC的一部分,我已经将配置作为一场战争的一部分。为了启用它,我在下面设置了配置- 应用属性 格拉德尔- 但执行器请求被现有的拦截器阻止。它要求在特定于我们项目的标题中传递值。通过postman(http:localhost:8080/abc/activator/prometheus),我可以测试

  • 兔子配置: 应用概述:每当gitRepository连接到我们的应用程序时,存储库名称就会成为交换名称,在这种情况下,然后存储库的每个分支都会创建自己的队列,这里有两个队列和。现在每次在开发分支中创建拉取请求时,我都需要将信息传递给开发队列,并且应该由特定的侦听器侦听,该侦听器应该仅注册用于开发。我看到了动态队列的示例,但我似乎找不到任何关于如何创建将使用不同线程执行的动态侦听器的示例,我如何实现