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

ActiveMQ Artemis-使用JMS获取可用地址列表

孟英光
2023-03-14

我最近不得不从ActiveMQ 5.X切换到我正在进行的项目的ActiveMQ Artemis。我有一个函数可以读取可用主题并填充MySQL数据库中的表,但该函数不再适用于Artemis中方法的更改。

基本上,我不需要获得可用主题的列表(也称为多播队列),而是需要获得可用地址的列表,以便我的消费者可以连接并为该地址创建一个同名的多播队列。

以下是我需要此功能的原因:

    < li >用户使用网站(从数据库读取)从ActiveMQ中选择地址名称 < li >消费者连接到该地址名称并排队 < li>Java消费者/生产者每秒用网站的可用地址更新数据库

这是我以前在以前的ActiveMQ 5上使用的代码。x:

public class ActiveMQ {

    public ActiveMQ(String amq_url) throws JMSException, NamingException{
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(amq_url);      
        this.connection = (ActiveMQConnection) connectionFactory.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        connection.start();
    }

    public void useTopic(String topicName) throws JMSException{
        this.topic = session.createTopic(topicName);
        this.producer = session.createConsumer(topic);
    }

    
    public void readAvailableTopics() throws JMSException{ 
         
        Set<ActiveMQTopic> topics = connection.getDestinationSource().getTopics();
        System.out.println(topics.toString());
        return topics;
    }
 

readAvailableTopics()方法就是正在讨论的方法。

我在消费者端和生产者端都尝试过.getTopics()和.getQueues(),它们都会返回一个空集。我找不到任何JMS文档来获取可用地址。

任何帮助将不胜感激。

共有2个答案

楮乐邦
2023-03-14

ActiveMQ 5客户端通过咨询消息更新主题和队列列表。由于ActiveMQ Artemis 2.18默认情况下禁用了咨询消息支持,请参阅Artemis-3414。要启用咨询消息支持功能,请将SupportDvisory参数添加到接收器,即。

<acceptor name="artemis">tcp://0.0.0.0:61616?protocols=OPENWIRE;supportAdvisory=true</acceptor>
笪烨
2023-03-14

JMS规范不包括这样的管理操作,因此每个代理实现都有不同的访问方式。ActiveMQ Artemis在许多方面与ActiveMQ“经典”类似,但访问管理操作不同。也就是说,您可以使用JMS调用管理操作。您可以使用如下代码列出所有地址:

import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueRequestor;
import javax.jms.QueueSession;
import javax.jms.Session;
...
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.api.jms.management.JMSManagementHelper;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
...

QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management");
QueueRequestor requestor = new QueueRequestor(session, managementQueue);
Message m = session.createMessage();
JMSManagementHelper.putOperationInvocation(m, ResourceNames.BROKER, "getAddressNames");
Message reply = requestor.request(m);
boolean success = JMSManagementHelper.hasOperationSucceeded(reply);
if (success) {
   Object[] addresses = (Object[]) JMSManagementHelper.getResult(reply);
   for (Object address : addresses) {
      System.out.println(address);
   }
}
 类似资料:
  • 问题内容: 当前,提到的用于获取MAC地址的所有解决方案始终使用eth0。但是,如果接口不是以eth0开头,该怎么办呢?同样在OS X上,接口名称也不同。 eth0接口也可能存在但未使用。即不活跃,它没有一个IP。 因此,有没有一种方法可以获取第一个可用接口Active的MAC地址(即,它具有一个inet地址,我什至不希望有人拥有inet6)。 例如 注意:我更改了输出值。 因此,在这种情况下,我

  • X2.2.0新增 sp_get_user_avatar_url($avatar) 功能: 获取用户头像地址 参数: $avatar: 数据库中保存的用户头像文件路径 返回: 类型string,用户头像地址 使用: $url = sp_get_user_avatar_url('avatart/2231rweqrqwer.png'); echo $url;//输出用户头像地址

  • 我希望在连接到wifi网络时,在运行我的应用程序的手机上获取用户的本地IPv4地址。使用以下代码: 我可以得到一些接近IPv4地址的信息,但与命令行中的IPv4地址相比,它并不完全相同。有更好的办法吗?我知道formatIpAddress已被弃用,但在我找到获取IPv4地址的方法之前,我暂时不太担心这个问题。 编辑: 我发现手机wifi设置中的ip地址是我在使用建议的解决方案获取ip地址时得到的。

  • 问题内容: 我正在寻找一种方法(使用python)从本地网络上的设备获取地址。 地址是已知的。 目标是建立一个脚本,该脚本将定期轮询IP地址数据库,以确保mac地址没有更改,如果有更改,则将电子邮件警报发送给我自己。 问题答案: 用Python回答问题取决于您的平台。我没有Windows,因此以下解决方案可在我写过的Linux机器上使用。对正则表达式进行小的更改将使其在OS X中运行。 首先,您必

  • 问题内容: 我需要获取运行程序的系统的mac地址。但我无法做到这一点。 我正在编写以下代码: 我得到以下结果: 我没有得到MAC地址,它为空。 我从这里看到了这个例子 问题答案: 如果您考虑了多个接口和一些空MAC地址(我在装有VMWare的Windows 7上运行Java 7(因此我有一些虚拟网络适配器)),那么这段代码似乎可以正常工作: 这是运行它时在计算机上看到的内容(经过消毒的版本): 这

  • 问题内容: 我想获取使用我网站的客户IP地址。我正在使用PHP superglobal: 但是我看到它不能使用此提供正确的IP地址。我得到了我的IP地址,发现它与我的IP地址不同,并且我还可以在某些网站上看到我的IP地址,例如: 我粘贴了提供PHP功能的IP地址,但是此网站未显示任何结果。这个问题是怎么发生的,如何获得客户端的IP地址? 问题答案: 获取访问者/客户的IP地址的最简单方法是使用或变