`

web activeMq连接池实现JMS消息发送连接管理

 
阅读更多
1.今天来说一下在使用到MQ时如果使用MQ的连接池。之前我也是没有注意到MQ也是有连接池的,后来因为系统之前实现每次创建和关闭链接消耗资源、宕机频繁,所以领导要求解决我才接触到。
我在网上看到的关于JMS的讲解还挺多,但是对于MQ连接池的讲解时大家都是讲如何在spring中配置连接池。首先采用spring配置后原系统加密配置的密码就成明文了,另外如果要改成spring发送那改动就大了。如果在不使用spring,不大改动代码的情况下完成采用MQ连接池来获得链接呢?
2.首先要创建工程加入JAR包,这些包是必须的。至于activemq-pool-5.2.0.jar,你一定要找到加进去,你懂的。
你还要到官方下载一个MQ服务器,我使用的是5.2,下载后运行起来以备使用。
3.第二步我们要实现如何获得连接的。这里我做了两个实现,用于更直观的了解MQ连接池。
其中连接池工厂的活跃数我们设置为1,方便测试。这个活跃数实际上是会话的数量,而不是数据库连接池一样的链接数量。

package com.mq.service;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.pool.PooledConnectionFactory;
/**
 * 链接工厂管理类
 * 自己工厂定义成了单例模式,连接池是静态块进行初始化,具体实现自己看着办
 */
public class MQPooledConnectionFactory {
	private static ActiveMQConnectionFactory connectionFactory;
	/**
	 * 获得自己创建的链接工厂,这个工厂只初始化一次
	 */
	public static ActiveMQConnectionFactory getMyActiveMQConnectionFactory() {
		if (null == connectionFactory) {
			connectionFactory = new ActiveMQConnectionFactory("system","manage", "tcp://127.0.0.1:61616");
		}
		return connectionFactory;
	}
	private static PooledConnectionFactory pooledConnectionFactory;
	static {
		try {
			// 需要创建一个链接工厂然后设置到连接池中
			ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
			activeMQConnectionFactory.setUserName("system");
			activeMQConnectionFactory.setPassword("manage");
			activeMQConnectionFactory.setBrokerURL("tcp://127.0.0.1:61616");
			// 如果将消息工厂作为属性设置则会有类型不匹配的错误,虽然Spring配置文件中是这么配置的,这里必须在初始化的时候设置进去
			pooledConnectionFactory = new PooledConnectionFactory(activeMQConnectionFactory);
			// 链接最大活跃数,为了在测试中区别我们使用的到底是不是一个对象和看是否能控制连接数(实际上是会话数),我们在这里设置为1
			int maximumActive = 1;
			pooledConnectionFactory.setMaximumActive(maximumActive);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获得链接池工厂
	 */
	public static PooledConnectionFactory getPooledConnectionFactory() {
		return pooledConnectionFactory;
	}
	/**
	 * 对象回收销毁时停止链接
	 */
	@Override
	protected void finalize() throws Throwable {
		pooledConnectionFactory.stop();
		super.finalize();
	}
}


这个类会提供连接池工厂和MQ链接工厂的创建和获得方式。特别要注意到的是,在初始化连接池时要设置一个链接工厂进去,而且只能在初始化时作为参数传递进去,如果你看过spring的配置你会以为要做为属性传递,而且他确实有这个属性。
然后我们创建发送消息的基础类,在该类中得到链接然后创建消息进行发送,关闭会话等一些列操作。为了防止变量干扰,这些操作是在一个方法里面完成的。

package com.mq.service;
import java.util.Map;
import java.util.Set;
import javax.jms.Connection;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
 * 数据发送类,用于发送数据
 * 如果获得链接,请查看被注释的代码
 */
public class MQ_Service {
	// 发送消息
	@SuppressWarnings("static-access")
	public void send(Map<String, String> map) throws Exception {
		ActiveMQConnectionFactory connectionFactory = null;
		Connection connection = null;
		Session session = null;
		Queue queue = null;
		MessageProducer producer = null;
		MapMessage messagep = null;	
		// ====================================
		try {
			// 获得我们自己初始化的链接工厂然后创建链接
			connectionFactory = MQPooledConnectionFactory.getMyActiveMQConnectionFactory();
			connection = connectionFactory.createConnection();
			
			// 链接直接从链接池工厂进行获得
			//connection = MQPooledConnectionFactory.getPooledConnectionFactory().createConnection();
			
			session = connection.createSession(false, session.AUTO_ACKNOWLEDGE);			
			queue = session.createQueue("CUI_JMS");
			producer = session.createProducer(queue);
			// 链接开始,如果我们使用的是连接池,那么即使你不开始,也是没有问题的
			connection.start();			
		} catch (Exception e) {
			e.printStackTrace();
		}
		// ====================================
		messagep = session.createMapMessage();
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			String value = map.get(key);
			messagep.setBytes(key, value.getBytes("UTF-8"));
			System.out.println(key + "-->" + value);
		}		
		producer.send(messagep);		
		messagep.clearBody();
		messagep.clearProperties();		
		// ===================================
		// 通过打印会话的内存地址和链接的客户端编号就可以知道我们使用的是不是同一个会话和链接
		System.out.println(session.toString());
		System.out.println(connection.getClientID());
		// 无论使用的自己的工厂还是连接池的,都要将会话关闭
		// 如果不关闭,在使用连接池的时可以看到效果,发送两次时只能发送一次,造成堵塞
		session.close();
		// 使用自己的工厂和连接池的区别是,运行后自己工厂链接调用关闭程序结束
		// 而调用连接池链接进行关闭实际上没有关闭,因为连接池要维护这个链接
		connection.close();
		messagep = null;
	}
	private MQ_Service() {
	}
	// 发送对象每次创建一个,用以区别我们使用的对象
	public static MQ_Service getInstance() {
		return new MQ_Service();
	}
	// 对外开发发送消息方法
	@SuppressWarnings("unchecked")
	public synchronized void sendMessage(Map map)
			throws Exception {
		this.send(map);
	}
}


取消注释内容,并注释掉获得我们自己初始化的链接工厂然后创建链接下面的两行代码,我们的链接就是从连接池获得了。
你可以打印链接、会话等各个对象的内存地址来查看是否是同一个对象内容。
多次调用发送消息,查看是否能发送消息和是否能控制链接,当然准确来说是会话数

package com.mq.service;
import java.util.HashMap;
import java.util.Map;
/**
 * 调用发送
 */
public class MQ_Sender {
	public static void main(String[] args) throws Exception {
		// 循环调用,这里定义调用两次
		for (int i = 0; i < 2; i++) {
			MQ_Service sender = MQ_Service.getInstance();
			Map<String, String> map = new HashMap<String, String>();
			map.put("MESS_NUM", "112110119");
			map.put("MESS_DEPT", "本部");
			sender.sendMessage(map);
			System.out.println("数据已经发送完毕!");
		}
	}
}


转自:http://cuisuqiang.iteye.com/blog/1329455
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    activemq入门实例,有源代码

    8. **连接池与网络拓扑**:ActiveMQ支持连接池,优化资源利用。在网络拓扑方面,可以设置多个broker形成集群,提高可用性和负载均衡。 9. **消息选择器**:消费者可以使用消息选择器只接收满足特定条件的消息,这样...

    ActiveMQ开发实例-5

    在"ActiveMQ开发实例-5"中,重点在于实际操作和实践,通过C++和MFC实现消息的发送和接收,结合其他实例资源,你可以更深入地理解ActiveMQ的使用和功能。通过这个实例,开发者可以将消息队列技术有效地应用于自己的...

    Spring Boot整合ActiveMQ

    Spring Boot 整合 ActiveMQ 的过程涉及到多个技术栈的集成,包括前端模板引擎Thymeleaf、数据库连接池Druid、事务管理以及消息队列的使用。以下将详细阐述这些知识点。 1. **Spring Boot**: Spring Boot 是由 ...

    activemq_basic.rar

    4. **连接管理**:说明如何管理和控制ActiveMQ的连接,例如连接池和会话管理。 5. **消息类型和属性**:介绍不同类型的消息(文本、二进制、对象消息等)及其属性设置,以及如何处理它们。 6. **消息 selectors**:...

    ActiveMQ整合Spring(多消费者)

    在ActiveMQ中,可以通过设置消费者的订阅类型(Durable Subscription或Shared Subscription)来实现消息的多消费者分发策略。 6. **事务管理**: Spring与ActiveMQ整合时,还可以支持JMS事务,确保消息的一致性。`...

    spring整合Activemq源码

    总结,`spring整合Activemq源码`项目展示了如何在Spring和SpringMVC环境中利用ActiveMQ实现消息的发布与订阅。通过理解这些知识点,开发者能够更好地理解和实践消息队列在实际项目中的应用,提升系统的稳定性和扩展...

    ActiveMQ手册 - 开发文档

    JMS是Java平台上的一个API,用于在分布式环境中发送、接收和管理消息。ActiveMQ作为JMS提供者,支持点对点(Queue)和发布/订阅(Topic)两种消息模型,以及事务处理和消息确认机制,确保消息的可靠传输。 **3. ...

    Spring整合activemq

    通常,我们会创建一个`PooledConnectionFactory`来提高性能,通过连接池管理JMS连接。 2. **Destination配置**:在消息传递中,消息生产者和消费者需要知道发送和接收消息的目的地,这在JMS中被称为`Destination`。...

    activemq(2018最新版)

    2. **性能优化**:合理配置缓存大小、消息批量发送、选择合适的消息格式(如文本、二进制或XML)以及使用连接池来提升性能。 3. **安全性**:通过SSL/TLS加密连接,限制用户权限,防止未经授权的访问。 4. **监控和...

    ActiveMQ生产者

    - 考虑到性能和资源使用,合理配置ActiveMQ的连接池和线程池大小。 通过理解这些基本概念和步骤,你可以构建起一个简单的ActiveMQ生产者,为你的应用添加消息队列通信的能力。随着对ActiveMQ特性的深入理解和实践...

    apache-activemq-5.8.0-bin.zip

    - ActiveMQ作为JMS实现,提供了生产者、消费者模型,使得消息生产者可以在不关心消息消费者状态的情况下发送消息,提高了系统的解耦性。 3. **文件结构解析** - `META-INF`目录:包含关于此发布版的元数据,如...

    activemq整合spring完整实例代码(内含所有相关jar包)

    2. **ActiveMQ连接配置**:`ConnectionFactory`的配置通常会包含ActiveMQ服务器的URL,如`tcp://localhost:61616`,这是默认的ActiveMQ监听端口。此外,还可以配置连接池参数、超时设置等。 3. **JmsTemplate使用**...

    activemq1.14.4

    Apache ActiveMQ是世界上最流行的开源消息代理和队列服务器,它基于Java Message Service(JMS)规范,用于在分布式系统中实现可靠的消息传递。这个压缩包文件"apache-activemq-5.14.4"包含了ActiveMQ的第5.14.4版本...

    linux下使用的apache-activemq-5.9.0-bin包.zip

    Apache ActiveMQ是Apache软件基金会的一款开源消息中间件,它基于Java Message Service (JMS) 规范,提供了高效、可靠的异步消息传递功能。在Linux环境下使用`apache-activemq-5.9.0-bin.tar.gz`压缩包,我们可以...

    activemq与spring整合

    1. **连接池**:为提高性能,可以使用PooledConnectionFactory来管理连接,避免频繁创建和销毁连接。 2. **并发控制**:合理设置MessageListenerContainer的并发消费者数量,平衡响应速度和资源消耗。 3. **事务管理...

    ActiveMQ问题解决记录

    在IT行业中,Apache ActiveMQ是一个广泛使用的开源消息代理和队列服务器,它是Java Message Service (JMS) 的实现,允许应用程序之间进行异步通信。这篇博客"ActiveMQ问题解决记录"可能涵盖了作者在使用ActiveMQ过程...

    Spring集成ActiveMQ配置.docx

    * lib/activemq-pool-5.4.2.jar:ActiveMQ 的连接池模块的 jar 包 * lib/activemq-protobuf-1.1.jar:ActiveMQ 的 Protocol Buffers 模块的 jar 包 * lib/activemq-spring-5.4.2.jar:ActiveMQ 的 Spring 模块的 jar...

    activemq入门总结

    ActiveMQ是基于Java Message Service (JMS) API 的,它允许应用程序在分布式环境中发送和接收消息,从而实现异步通信和解耦。 在了解ActiveMQ前,首先需要理解JMS的基本概念。JMS 是Java平台用于创建、发送、接收和...

    apache-activemq-5.18.3-bin.tar.gz

    - **连接池优化**:使用连接池管理客户端连接,提高性能。 以上就是关于Apache ActiveMQ 5.18.3在Linux服务器上安装和使用的相关知识点,这些知识涵盖了从基本概念到高级配置,对于理解和操作这个消息中间件至关...

Global site tag (gtag.js) - Google Analytics