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

带有Artemis 2.6.3组播(主题)的Spring WebSocketMessageBrokerConfigurer不工作

慕阳
2023-03-14

Artemis mutilcast地址和队列没有预期的行为。我的想法是创建组或特定的消息给一个用户,可以有多个websocket会话(web,android等)。服务器将向artemis组播地址发布通知,所有订阅服务器都应该收到通知。在curren scenarion中,我只强制用户'LuisLaves00'并创建多个会话。在artemis中,我可以看到两个消费者(不确定spring中的Message Broker Relay是如何完成它的工作的),但是消费者的行为像是循环赛,而不是发布者-订阅者。使用Spring中的in memory broker,它工作得很好,但它不持久,所以当没有订阅者连接时,消息就会被丢弃。下面是我使用的代码:

客户端部分:

function connect() {
    var socket = new SockJS('/notification-websocket');
    stompClient = Stomp.over(socket);
    var headers = {
        // todo: server will handle this logic
        'client-id': 'luisalves00',
        'durable-subscription-name': 'luisalves00',
        'id' : 'luisalves00'
    };
    stompClient.connect(headers, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        // todo: server will handle this logic
        stompClient.subscribe('/topic/notification/username' + 'luisalves00', function(notification) {
            showNotification(JSON.parse(notification.body).content);
        }, headers);
    });
}

代理中继配置:

public void configureMessageBroker(MessageBrokerRegistry config) {
        // Artemis ->
        // tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true
        config.enableStompBrokerRelay("/topic").setRelayHost("127.0.0.1").setRelayPort(61613);
        config.setApplicationDestinationPrefixes("/app");
        //config.enableSimpleBroker("/topic");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        logger.info("Registering the stomp endpoints.");

        registry.addEndpoint("/notification-websocket").setAllowedOrigins("*").withSockJS();

    }

服务器虚拟通知生成器:

@Scheduled(fixedDelay = 20000)
public void scheduleTaskWithFixedDelay() {
    final Notification message = new Notification(UUID.randomUUID().toString() + " -> "  + dateTimeFormatter.format(LocalDateTime.now()));
    try {
        final String user = "luisalves00";
        logger.info("Creating msg={}", message);
        final Map<String, Object> headers = new HashMap<>();
        headers.put("subscription-id", user);
        template.convertAndSend("/topic/notification/username/" + user, message, headers);
    } catch (Exception e) {
        logger.error("", e);
    }
}

当客户端订阅时,artemis使用以下参数创建地址和持久队列:

Addesses: 
id=2147496008 name=/topic/notification/group1/ routingType=[MULTICAST] queueCount=1

Queue
id=2147496011 
name=group1.group1 
address=/topic/notification/group1/ 
routingType=MULTICAST
durable=true
maxConsumers-1
purgeOnNoConsumers=false 
consumerCount=0

共有1个答案

姚星河
2023-03-14

要使工作持久,必须使用:

'client-id': '<some unique identifier for each client>'
'durable-subscription-name': 'tech-news'

对于我的实现,我停止使用持久,因为通知的思想是在创建时交付(低延迟)。如果消费者没有连接,它可以连接到一个历史数据库,以获取他在连接时没有收到的旧消息。如果您真的想让它持久化,我建议在服务器端处理连接的用户的'client-id'和持久化-subscription-name'。如果用户没有正在进行的会话,则创建一个持久队列。他创建的下一个会话应该是非持久的,因为它们将收到与持久会话相同的消息。如果第一个会话死亡,他仍然在其他会话上接收消息。当所有消息都死亡并重新连接时,这将再次成为第一个会话,他将接收所有未在持久队列中传递的消息(可能有些消息已经在非持久队列中接收),但他将拥有所有消息的历史记录(正如前面所说,我认为应该以其他方式处理)。

 类似资料:
  • 我需要帮助数据属性的猫头鹰-旋转木马。 正如您在我示例中所看到的,在幻灯片1和3中,每个项目都有VALUE属性。但在幻灯片2上,该值为空。 我的目标是根据属性中的值设置颜色背景,如果值可用,则设置addClass“活动”条件。我需要帮助删除“active”,如果在属性中没有值。 提前谢谢你。 代码本中的示例https://Codepen.io/jafaris-mustafa/pen/xwjwjaz

  • 是否有人成功使用新的游戏服务操作系统许可证库?尝试按此处所述使用它时: https://developers.google.com/android/guides/opensource 我明白了: 原因:Java . lang . illegalstateexception:需要使用主题。AppCompat主题(或后代)与此活动。在Android . support . V7 . app . app

  • 我需要帮助数据属性的猫头鹰-旋转木马。 正如您在我示例中所看到的,在幻灯片1和3中,每个项目都有属性。仅工作事件是触发器,但不在加载幻灯片1(第一张幻灯片)时工作。 提前谢谢你。 代码本中的示例https://Codepen.io/jafaris-mustafa/pen/xwjwjaz null null

  • 我正在尝试自定义AlertDialog按钮的强调色。但它并没有产生任何影响,它似乎是从系统中继承了颜色。这是我的风格/主题。 这是我试图构建警报对话框的代码。 编辑1: 我尝试了使用的方法,但它给出了相同的结果。 编辑2: 我还尝试更改对话框的重音颜色,但没有看到该颜色: 即使这样也不会改变按钮文本的颜色:(。

  • 我一直在寻找了解这 3 个: 主题 行为主体 重播主题 我想使用它们,并知道何时、为什么使用它们,使用它们有什么好处,尽管我已经阅读了文档、观看了教程并搜索了谷歌,但我对此没有任何理解。 那么他们的目的是什么?一个真实的案例将是最受欢迎的,它甚至不需要编写代码。 我更喜欢一个干净的解释,而不仅仅是“a b = 非常感谢。

  • 我对spring boot和创建我的第一个应用程序非常陌生。创建数据源时,我使用了带有前缀的@ConfigurationProperties和要从Application.Property中读取的属性。 但是,这个设置似乎对我不起作用,我的程序没有运行。 我的pom.xml文件包含: 我的存储库类: 我的主要类: 请让我知道如果我需要提供任何其他信息以及。