rdreamland 2013-11-05 07:00 采纳率: 0%
浏览 1534

C# 怎么监听ActiveMq连接异常?

我想得到ActiveMq的登录用户列表,和离线信息,有没有办法,我在ActiveMq的bat运行服务器中看到了用户离线消息,我怎么通过ActiveMq的DLL监听他们的这些离线信息。
我用IConnection中的ExceptionListener事件不好用,什么也接不到也不触发,不知道这兄弟是做什么的。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-27 20:36
    关注

    该回答引用ChatGPT

    您可以使用NMS API来监听ActiveMQ连接异常和获取登录用户列表等信息。


    以下是一个示例代码片段,演示如何使用NMS API来监听连接异常:

    using Apache.NMS;
    using Apache.NMS.ActiveMQ;
    
    IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
    IConnection connection = factory.CreateConnection();
    connection.ExceptionListener += new ExceptionListener(OnException);
    
    private void OnException(Exception ex)
    {
        Console.WriteLine("Exception occurred: " + ex.Message);
    }
    

    在这个示例中,我们首先使用NMS API创建了一个连接工厂对象,并将其传递给ConnectionFacotry构造函数中,指定了ActiveMQ Broker的地址。然后我们使用连接工厂对象创建了一个连接对象,并通过连接对象的ExceptionListener事件注册了一个异常监听器。


    如果连接出现任何异常,OnException方法将被调用,并将异常对象作为参数传递。您可以在这个方法中执行任何您需要的操作,例如记录异常信息或者尝试重新连接等。


    要获取登录用户列表,您可以使用ActiveMQ的JMX管理API。您需要在ActiveMQ Broker中启用JMX,并使用JMX API连接到Broker并查询相关信息。以下是一个示例代码片段,演示如何使用JMX API获取登录用户列表:

    using System;
    using Apache.NMS.ActiveMQ;
    using Apache.NMS.ActiveMQ.Transport;
    using Apache.NMS.ActiveMQ.Transport.Tcp;
    using Apache.NMS.Util;
    using Apache.NMS.ActiveMQ.Transport.Transport;
    
    Uri jmxUri = new Uri("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
    TransportConnection transport = new TcpTransportFactory().CreateTransport(jmxUri) as TransportConnection;
    transport.Start();
    IMBeanServerConnection connection = new MBeanServerConnectionFactory(jmxUri).CreateMBeanServerConnection();
    ObjectName[] consumers = connection.QueryNames(new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost,connector=clientConnectors,connectorName=openwire"), null);
    
    foreach (ObjectName consumer in consumers)
    {
        ObjectName[] subscriptions = connection.QueryNames(new ObjectName(consumer.CanonicalName + ",destinationType=Queue,destinationName=*"), null);
        foreach (ObjectName subscription in subscriptions)
        {
            string user = (string)connection.GetAttribute(subscription, "UserName");
            Console.WriteLine("User: " + user);
        }
    }
    

    在这个示例中,我们首先构造了一个JMX URI对象,指定了JMX服务的地址和端口号。然后我们使用TcpTransportFactory类创建了一个TCP传输对象,将JMX URI作为参数传递给构造函数中,并启动了传输对象。


    接着,我们使用MBeanServerConnectionFactory类创建了一个MBeanServerConnection对象,并将JMX URI作为参数传递给构造函数中,从而连接到ActiveMQ Broker的JMX管理服务。


    最后,我们使用MBeanServerConnection对象的QueryNames方法,查询了当前连接到Broker的所有消费者对象,并循环遍历了每个消费者对象,并查询了与该消费者相关的所有订阅对象。然后,我们使用MBeanServerConnection对象的GetAttribute方法,获取了每个订阅对象的UserName属性值,并将其输出到控制台。

    评论

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。