`
7wolfs
  • 浏览: 183242 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ActiveMQ 开发

 
阅读更多
1, 配置activemq.xml时,修改<broker>子节点内容时,子节点需要按照字母顺序排在<broker>中,按照xsd定义要求对activemq.xml内容进行编排。

2, 使用Ajax与ActiveMQ交互时,如果一个浏览器窗口打开多个tab,每个tab使用amq.init初始化了一个amq 对象,那只有一个amq对象会生效。
为了解决这个问题,从ActiveMQ 5.4.2开始, 在调用 amq.init 时,指定 a unique clientId,此时一个浏览器窗口里的多个tab的amq对象就可以共存生效,每个tab里的amq对象都可以独立与broker交互。

3, ActiveMQ利用Ajax使用轮询机制去获取服务器的信息,而不是使用服务器推送方式。
理由参见:Comparison to Pushlets in http://activemq.apache.org/ajax.html

4, 往activeMQ的Ajax请求加入用户验证信息时, 需要修改amq.js中的buildParams方法和init方法.

5, 启动connection的类如果不关闭connection,该类将处于活动状态,与activeMQ也将处于连接状态.

6, MessageConsumer.receive方法用于同步接收消息,如果topic、queue里没有消息,就处于等待状态,一旦获取过一次消息,则该consumer.receive就不再接收消息。

7, ActiveMQ 与 web server集成
7.1 在web.xml中加入如下配置,
<context-param>
		<param-name>brokerURI</param-name>
		<param-value>/WEB-INF/activemq-simple.xml</param-value>
	</context-param>

<listener>
		<listener-class>org.apache.activemq.web.SpringBrokerContextListener</listener-class>
	</listener>



7.2 在项目的lib中加入依赖的jars, 如: spring-web-3.0.3.RELEASE.jar, camel等jar.

8, 控制消息级别的安全过滤
8.1 实现MessageAuthorizationPolicy接口
8.2 在activemq.xml中加入如下配置信息,
<messageAuthorizationPolicy>
<bean class="cn.com.*.messageagent.utils.AuthorizationPolicy" xmlns="http://www.springframework.org/schema/beans"/>
</messageAuthorizationPolicy>


9. 使用jconsole监控ActiveMQ
9.1 修改activemq.xml, 在broker元素中加入 useJmx="true" 属性。
9.2 修改activemq.bat, 加入SUNJMX=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
9.3 在dos窗口中输入jconsole,在“远程连接”中输入:service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi,可以在jconsole的控制台中查看ActiveMQ的使用情况。

10. ActiveMQ 4.0 的bug
问题: 对于auto-acknowledge的queue有bug,会从queue重复发送同一条messge给consumer。
解决方案:将OptimizeAcknowledge 设为false。设置的途径有三种:
1) cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.optimizeAcknowledge=true");
2) ((ActiveMQConnectionFactory)connectionFactory).setOptimizeAcknowledge(true);
3) ((ActiveMQConnection)connection).setOptimizeAcknowledge(true);

11. ActiveMQ 4.0 的JAAS在JDK 1.4下的实现
11.1 首先获取ActiveMQ 的activemq-jaas-4.0-M1.jar (for JDK 1.5),该包不在4.0的发布包里,需要单独下载
11.2 使用retrotranslator将jaas jar转成符合jdk 1.4要求的jar。
java -jar retrotranslator-transformer-1.2.9.jar  -srcjar activemq-jaas-5.5.0.jar -destjar activemq-jaas-5.5.0-for4.jar

11.3 在启动ActiveMQ的启动脚本activemq.bat中加入JAAS配置文件路径
-Djava.security.auth.login.config=login.config

11.4 配置ActiveMQ,修改activemq.xml、login.config、users.properties、groups.properties.
其中对于login.config, 里面的java package要与jaas jar里的package路径一致。如:org.activemq.jaas.PropertiesLoginModule,org.activemq.jaas.properties.user, org.activemq.jaas.properties.group
activemq-domain {
    org.activemq.jaas.PropertiesLoginModule required
        debug=true
        org.activemq.jaas.properties.user="users.properties"
        org.activemq.jaas.properties.group="groups.properties";
};


12. 使用JMX与ActiveMQ 4.0 通信,获取topic、queue等信息
12.1 使用retrotranslator 将activemq-web-5.5.0.jar转成符合jdk 1.4的jar
12.2 引入jar:mx4j-remote-3.0.2.jar,activemq-web-5.5.0.jar-for4.jar,slf4j-log4j12-1.5.11.jar
12.3 在activemq.xml文件中的broker加入 useJmx="true" 属性内容。
12.4 Java程序代码如下:
public static void getStaticsFromAMQ() {
		RemoteJMXBrokerFacade createConnector = new RemoteJMXBrokerFacade();   
        System.setProperty("webconsole.jmx.url", "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");   
        //System.setProperty("webconsole.jmx.user","controlRole");   
        //System.setProperty("webconsole.jmx.password","abcd1234");   
        SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration();   
        createConnector.setConfiguration(configuration);   
        try {   
            BrokerViewMBean brokerAdmin = createConnector.getBrokerAdmin();   
//	            String brokerName =(brokerAdmin).getBrokerName();  
//	            System.out.println("BrokerName ="+brokerName );  
            long messages =brokerAdmin.getTotalMessageCount();  
            System.out.println("messages ="+messages );  
            long consumerCount=brokerAdmin.getTotalConsumerCount();  
            System.out.println("consumerCount ="+consumerCount );  
            long dequeueCount=brokerAdmin.getTotalDequeueCount();  
            System.out.println("dequeueCount ="+dequeueCount );  
            long enqueueCount=brokerAdmin.getTotalEnqueueCount();  
            System.out.println("enqueueCount ="+enqueueCount );  
              
//	            System.out.println(((ActiveMQConnection) brokerAdmin).getBrokerName());   
            //获取Topic相关的ObjectName  
            ObjectName[] topicList=brokerAdmin.getTopics();  
            List answer = (List) createConnector.getTopics(); //getManagedObjects(topicList, TopicViewMBean.class);
            for (int i = 0; i < answer.size(); i++) {
            	TopicViewMBean value = (TopicViewMBean) answer.get(i);
            	System.out.println("topic ="+value.getName() + ";enqueued:" + value.getEnqueueCount()
            			+ ";dequeued:"+value.getDequeueCount() + ";queueSize:" + value.getQueueSize());
            }
            
            //获取Queue相关的ObjectName  
//	            ObjectName[] queueList=brokerAdmin.getQueues();
            answer = (List) createConnector.getQueues();
            for (int i = 0; i < answer.size(); i++) {
            	QueueViewMBean value = (QueueViewMBean) answer.get(i);
            	System.out.println("queue ="+value.getName() + ";enqueued:" + value.getEnqueueCount()
            			+ ";dequeued:"+value.getDequeueCount() + ";queueSize:" + value.getQueueSize());
            }
            
            //根据ObjectName创建相关的JMX对象获取相关的信息。  
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
	}



13. 获取queue类型队列中剩余消息条数
public static void getNumOfMsg() throws JMSException, VSJMSException {
		Connection connection = EndPointManager.getInstance().getConnection();
		connection.start();
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		Queue queue = session.createQueue("QUEUES." + "test");
		QueueBrowser browser = session.createBrowser(queue);

		int maxMessages = 100;
		Enumeration iter = browser.getEnumeration();
		int counter = 0;
        for (; iter.hasMoreElements() && (maxMessages <= 0 || counter < maxMessages); counter++) {
            Message message = (Message) iter.nextElement();
        }
        log.info("count:" + counter);
	}
分享到:
评论

相关推荐

    ActiveMQ开发规范及方案

    ActiveMQ开发规范及方案 ActiveMQ是一种流行的开源消息队列 middleware,广泛应用于分布式系统中。作为一种消息队列 middleware,ActiveMQ提供了许多功能,例如支持多种消息协议、事务支持、持久化机制等。为了确保...

    Delphi ActiveMQ 开发包

    **Delphi ActiveMQ 开发包详解** 在软件开发中,消息中间件扮演着至关重要的角色,它能够实现应用之间的解耦,提高系统的可扩展性和稳定性。ActiveMQ是Apache基金会的一个开源项目,它是一个功能强大的消息代理,...

    ActiveMQ开发实例-1

    在"ActiveMQ开发实例-1"中,你将学习如何使用 ActiveMQ-CPP 库进行基本的发布/订阅(Publish/Subscribe)和点对点(Point-to-Point)模式的消息传递。这两种模式是消息中间件中最常见的通信模型。 1. **发布/订阅...

    ActiveMQ开发实例-2

    总结来说,ActiveMQ开发实例-2提供了使用C++和MFC与ActiveMQ交互的实际案例。通过理解ActiveMQ的基本原理和操作,结合MFC库的特性,开发者可以构建高效、可靠的分布式消息系统。在实践中,不断探索和优化,将有助于...

    ActiveMQ 开发例子

    ActiveMQ 开发例子初学者可以看看

    ActiveMQ开发实例-5

    **ActiveMQ开发实例-5** Apache ActiveMQ是业界广泛使用的开源消息代理,它遵循Java Message Service (JMS) 规范,提供可靠的消息传递服务,适用于多种编程语言,包括C++和MFC(Microsoft Foundation Classes)环境...

    activeMq in action 使用activeMq开发JMS的简单讲述

    三、使用ActiveMQ开发JMS 1. **安装配置**:首先,下载并安装ActiveMQ,配置相关参数,如端口、日志位置等,并启动服务器。 2. **创建连接工厂**:在Java代码中,我们需要创建一个JMS连接工厂,通常使用`...

    ActiveMQ开发实例-3

    ActiveMQ开发实例-3,开发工程配置说明,需配合ActiveMQ开发实例系列其他资源使用

    ActiveMQ开发实例-6

    ### ActiveMQ开发实例核心知识点解析 #### 一、ActiveMQ简介 **ActiveMQ**是由Apache组织维护的一个开源项目,作为一款高性能的消息中间件,它在众多消息传递系统中脱颖而出。ActiveMQ不仅支持JMS 1.1和J2EE 1.4...

    ActiveMQ开发实例-4

    首先,对于"ActiveMQ开发实例-4",我们可能涉及到的是在已有系列教程的基础上更深入的应用或解决特定问题。这通常包括创建生产者和消费者,设置消息属性,处理事务,以及可能的故障恢复策略等。开发者需要理解...

    ActiveMQ手册 - 开发文档

    通过阅读《ActiveMQ中文手册》和《ActiveMQ开发手册》,开发者将能够全面了解和掌握ActiveMQ的各个方面,包括基本概念、配置、使用技巧以及性能调优,从而在实际项目中充分利用其功能,构建稳定、高效的分布式系统。

    activemq开发工具

    这个"activemq开发工具"是一个本地版本的ActiveMQ,特别适用于开发者在开发过程中进行本地调试。 ActiveMQ的核心特性包括: 1. **跨语言支持**:由于其基于Java,ActiveMQ可以与任何支持JMS的编程语言(如Java、...

    activemq开发文档

    ### ActiveMQ 开发文档知识点详解 #### 一、引言 随着分布式系统规模与复杂性的增加,传统的远程过程调用(RPC)中间件技术(如CORBA、DCOM、RMI等)逐渐暴露出局限性,例如同步通信、生命周期耦合等问题。针对...

    ActiveMQ开发教程

    ### ActiveMQ开发教程知识点详解 #### 一、ActiveMQ特性 **1.1 ActiveMQ服务器工作模型** ActiveMQ采用了一种灵活且强大的消息传递模型,它支持多种消息传递模式,如点对点(PTP)和发布/订阅(pub/sub)等。在...

    使用Apache ActiveMQ开发企业级系统案例(核心原理、框架整合、中间件、(项目文档+数据库+完整源码)-适合毕设论文

    MQJMS以及ActiveMQ的关系理解 主动式MQ ActiveMQ的环境搭建 ...分布式ActiveMQ集群开发详解 ActiveMQ集群配置方法 在Spring下集成ActiveMQ ActiveMQ中间件实现实时消息传递第13讲-使用ActiveMQ与Sping框架整合案例

    ActiveMQ教程

    在使用ActiveMQ开发应用程序之前,需要在项目的构建配置文件(例如`pom.xml`)中引入必要的依赖库。以下是一个典型的配置示例: ```xml &lt;project.build.sourceEncoding&gt;UTF-8 &lt;spring.version&gt;4.2.4.RELEASE ...

    Instant Apache ActiveMQ Messaging Application Development How-to源码

    本指南主要关注如何使用ActiveMQ开发消息应用,通过`Instant Apache ActiveMQ Messaging Application Development How-to源码`,我们可以深入理解ActiveMQ的核心特性和实际应用。 1. **ActiveMQ简介**: - **概念*...

    ActiveMQ消息中间件面试专题.zip

    适合不同的应聘者:这份面试专题资料既适合有一定经验的ActiveMQ开发人员,也适合初学者和想要了解ActiveMQ的人使用。初学者可以从基础知识开始学习,逐渐掌握更多的知识,而有经验的开发人员可以通过这份面试专题...

Global site tag (gtag.js) - Google Analytics