JMSTemplate 检查主题是否存在并获取订阅者数量

2023-12-22

我一直在寻找一些文档/示例来检查动态创建的主题是否存在,如果存在,如何获取该主题的订阅者计数。

我使用以下代码向主题发送消息 -

jmsTemplate.send(destination, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage();
                message.setText(commandStr);

                return message;
            }
        });

这段代码似乎创建了主题并将消息发布到主题。

  1. 我需要在创建主题之前检查该主题是否存在。
  2. 检查主题是否有订阅者。

提前致谢

我能够找到(1)问题的解决方案(希望这有帮助)-

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection();
connection.start();
DestinationSource ds = connection.getDestinationSource();
Set<ActiveMQTopic> topics = ds.getTopics();

要获取目的地名称,正如您所做的那样,它是正确的,您可以通过 JMX 来专门获取订阅者计数等统计信息......

import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.TopicViewMBean;

public class JMXGetDestinationInfos {

    public static void main(String[] args) throws Exception {
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
        Map<String, String[]> env = new HashMap<>();
        String[] creds = { "admin", "admin" };
        env.put(JMXConnector.CREDENTIALS, creds);
        JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
        MBeanServerConnection conn = jmxc.getMBeanServerConnection();

        ObjectName activeMq = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost");

        BrokerViewMBean mbean = MBeanServerInvocationHandler.newProxyInstance(conn, activeMq, BrokerViewMBean.class,
                true);
        for (ObjectName name : mbean.getTopics()) {
            if (("YOUR_TOPIC_NAME".equals(name.getKeyProperty("destinationName")))) {
                TopicViewMBean topicMbean = MBeanServerInvocationHandler.newProxyInstance(conn, name,
                        TopicViewMBean.class, true);
                System.out.println(topicMbean.getConsumerCount());
            }
        }
    }
}

or

import java.util.Set;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.advisory.DestinationSource;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;

public class AdvisorySupportGetAllDestinationsNames {

    public static void main(String[] args) throws JMSException {
        Connection conn = null;
        try {
            ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
            conn = cf.createConnection();
            conn.start();
            DestinationSource destinationSource = ((ActiveMQConnection) conn).getDestinationSource();
            Set<ActiveMQQueue> queues = destinationSource.getQueues();
            Set<ActiveMQTopic> topics = destinationSource.getTopics();
            System.out.println(queues);
            System.out.println(topics);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
        }
    }
}

UPDATE

您可以使用AdvisorySupport.getConsumerAdvisoryTopic()

请注意,消费者启动/停止咨询消息也有一个 ConsumerCount 标头,指示活跃消费者的数量 发送咨询消息时的目的地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JMSTemplate 检查主题是否存在并获取订阅者数量 的相关文章

随机推荐

  • 无法在 Windows 上写入生成的 child_process 的标准输入

    下面的代码在 Linux 上运行良好 但在 Windows 7 上崩溃 var spawn require child process spawn var sass spawn sass sass stdout on data functi
  • 将变量值从 javascript 传递到 JSP

    我有以下场景
  • Azure Blob 存储容器有文件数量限制吗?

    正如问题提到的 Azure存储帐户中的每个容器是否有存储的文件数量限制 或者我们可以在每个容器中存储无限数量的文件 只要存储帐户下仍有可用空间 有什么官方文档可以参考吗 只要存储帐户下仍有可用空间 您就可以在每个容器中存储无限数量的文件 存
  • 如何在 PyQt5 Python 中根据窗口大小调整 PyQt5 堆叠小部件的大小?

    我正在设计一个ui in qt desginer 我必须创建一个用户界面 其中有一个带有按钮的侧面菜单栏 无论按下哪个按钮 其相应的数据都会显示在右侧 为了设计这个 我放置了两个QFrame in horizontal layout在中央小
  • ember-simple-auth deferReadiness 直到用户加载

    我正在使用 ember cli simple auth 并扩展了会话对象以包含从 me端点 但是 当重新加载页面并且用户登录时 会出现延迟 直到加载登录的用户信息为止 我想推迟应用程序准备就绪 直到检索到用户 我有这个在custom ses
  • 如何使用 Nvidia Visual Profile 和 Matlab 来分析 CUDA

    我需要从 Matlab 分析我的 CUDA 代码 我已经将一些 matlab 代码转换为 CUDA 以提高性能 我通过调用调用 CUDA 的 mexFunction 来完成此操作 matlab feval 函数没有提供足够的控制 我可以通过
  • Eclipse 关于 Java 中私有静态嵌套类的合成访问器的警告?

    我的同事建议使一些 Eclipse 代码格式和警告设置更加严格 大多数这些更改都是有意义的 但我在 Java 中收到了一个奇怪的警告 这是一些重现 问题 的测试代码 package com example bugs public class
  • Python 根据字典中的值绘制图表

    我有一本看起来像这样的字典 test 1092268 81 90 524292 80 80 892456 88 88 现在我想从这本字典中绘制一个简单的图 如下所示 test 1092268 x y 524292 x y 892456 x
  • JFrame 接近后台并听按键

    Working on a new personal project with jframe questions tagged jframe My goal is to close the frame in an ActionListener
  • 对 eval() 的调用被 CSP 使用 Selenium IDE 阻止

    我开发了一个硒测试Selenium IDE 我在这个套件中有一个步骤 应该在文本字段中输入一个值 它在该步骤失败并给出以下错误 18 click on id firstName Failed 11 12 59 call to eval bl
  • C 中的二维数组初始化

    我知道这是一个老栗子 但我想要在我的代码中静态分配一个小的二维数组 我知道做到这一点的方法是 static int A 3 2 1 2 3 4 5 6 没关系 我可以访问它的所有成员 但是 我在将其传递给函数时遇到了几个问题 例如 void
  • 为什么“VolatileQualifiedExpr + VolatileQualifiedExpr”在C中不一定是UB,而在C++中却不一定是UB?

    当我今天读 C 标准时 它提到了副作用 访问易失性对象 修改对象 修改文件或调用函数 这些操作中的任何一个都是副作用 C 标准说 访问由易失性泛左值 3 10 指定的对象 修改对象 调用库 I O 函数或调用执行任何这些操作的函数都是副作用
  • Elastic beanstalk 上的 wsgi 用户权限

    我正在使用弹性豆茎和 django 我的requirements txt 文件中的一个依赖项有一些在最初导入时执行的设置 设置的一部分是检查目录是否存在 否则创建它 我收到权限错误 因为用户 我假设是 wsgi 没有创建目录的权限 OSEr
  • Python 中的快速简单的文件对话框?

    我有一个简单的脚本 它解析文件并将其内容加载到数据库中 我不需要 UI 但现在我提示用户使用以下命令解析文件raw input这是最不友好的 特别是因为用户无法复制 粘贴路径 我想要一种快速简便的方法来向用户呈现文件选择对话框 他们可以选择
  • ExpandableListView 组项上的 Android LongClickListener

    我在本教程的帮助下创建了一个 ExpandableListView link http blog csdn net avenleft article details 7192972 我或多或少地理解了代码 并尝试在组上设置一个 longcl
  • 如何知道事务方案何时可序列化?

    我正在研究SQL 需要知道某个事务方案是否可序列化 我理解确定这一点的方法是制作一个以事务作为节点和节点之间的方向的图 如果该图是循环的 则该方案不可序列化 但这是什么意思以及什么决定了图中是否存在从一笔交易到另一笔交易的有向边 在这种情况
  • USE_CREDENTIALS 在新的 Android M API 中不可用

    在尝试新的权限 API 时 值得注意的是 ActivityCompat checkSelfPermission ActivityCompat shouldShowRequestPermissionRationale ActivityComp
  • 从 C 创建一个实现 __dict__ 的 Python 类型?

    如何创建一个类型以具有 dict 按照 正常 类的说法 它是在 Python 中定义的吗 是否有任何非动态类型的示例 dict s 通过 Python 定义类型通过 有一个tp dict成员PyTypeObject 但我找不到有关如何使用它
  • 如何在根视图中隐藏导航控制器?

    请帮助我在根视图中隐藏导航控制器 我找到了写的解决方案 navigationController setNavigationBarHidden YES 在我需要的每个视图控制器中 好吧 它可以工作 但只是第一次 我运行应用程序 在根视图中我
  • JMSTemplate 检查主题是否存在并获取订阅者数量

    我一直在寻找一些文档 示例来检查动态创建的主题是否存在 如果存在 如何获取该主题的订阅者计数 我使用以下代码向主题发送消息 jmsTemplate send destination new MessageCreator Override p