JMS 池连接不支持同步接收

使用org.apache.activemq.pool.PooledConnection连接,发送消息时不支持同步消息接收:

	/**
	 * 使用连接池
	 */
	public void init(){
		try {
			ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
					userName, password, url);		
			pooledConnectionFactory = new PooledConnectionFactory(connectionFactory);
			pooledConnectionFactory.setCreateConnectionOnStartup(true);
			pooledConnectionFactory.setMaxConnections(5);
			pooledConnectionFactory.setMaximumActiveSessionPerConnection(100);
			
			connection = pooledConnectionFactory.createConnection();
			
			System.out.println("2connection name:" + connection.getClass().getName());
			
			// 是生产和消费的一个单线程上下文。会话用于创建消息的生产者,消费者和消息。会话提供了一个事务性的上下文。
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 不支持事务
			// 目的地是客户用来指定他生产消息的目标还有他消费消息的来源的对象,两种消息传递方式:点对点和发布/订阅
			destination = session.createQueue(subject);
			// 会话创建消息的生产者将消息发送到目的地
			consumer = session.createConsumer(destination);	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	// 消费消息
	public void receiveMessage() throws JMSException, Exception {
		init();

		System.out.println("Consumer:->Begin listening...");
		// 开始监听
		TextMessage message = (TextMessage)consumer.receive();
		System.out.println("message:" + message.getText());
		
		close();
	}

直接使用org.apache.activemq.ActiveMQConnection,则可以接收同步消息。

	// 初始化
	private void initialize() throws JMSException, Exception {
		// 连接工厂是用户创建连接的对象,这里使用的是ActiveMQ的ActiveMQConnectionFactory根据url,username和password创建连接工厂。
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				userName, password, url);
		// 连接工厂创建一个jms connection
		try {
			connection = connectionFactory.createConnection();
			System.out.println("connection name:" + connection.getClass().getName());
			
			connection.start();
		} catch (Exception e) {
			if (connection != null)
				connection.close();
			System.exit(0);
		}

		// 是生产和消费的一个单线程上下文。会话用于创建消息的生产者,消费者和消息。会话提供了一个事务性的上下文。
		session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 不支持事务
		Session temp = connection
				.createSession(false, Session.AUTO_ACKNOWLEDGE); // 不支持事务
		// 目的地是客户用来指定他生产消息的目标还有他消费消息的来源的对象,两种消息传递方式:点对点和发布/订阅
		destination = session.createQueue(subject);
		// 会话创建消息的生产者将消息发送到目的地
		consumer = session.createConsumer(destination);

	}

	// 消费消息
	public void receiveMessage2() throws JMSException, Exception {
		initialize();

		System.out.println("Consumer:->Begin listening...");
		// 开始监听
		TextMessage message = (TextMessage)consumer.receive();
		System.out.println("message:" + message.getText());
		
		close();
	}

解决该问题的要点:

在获取连接后,要开始它!

connection.start();  //对于PooledConnection和ActiveMQConnection均要求调用该方法。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值