ActiveMQAPI

一、connection方法使用
  1、创建connection时,它的传输默认是关闭的,必须使用start方法开启。一个connection可以创建多个session。
  2、当一个程序执行完成后,必须关闭之前创建的connection,否则ActiveMQ不能释放资源。关闭Connection后,同时也关闭了Session\MessageProducer\MessageConsumer.
  
     Connection connection = connectionFactory.createConnection();
     Connection connection = connectionFactory.createConnection(String username,String password);
    


二、session方法使用
  1、Session是一个发送消息的线程,可以使用session创建MessageProducer\MessageConsumer和Message.
Session session = connection.createSession(boolean transacted, int acknowledgeMode)

  参数一:transacted是使用事务标识,结事事务有两种方法提交或者回滚。事务表求当一些数据被发送后,事务提交则消息被发送到MQ处理,在管控台才能看到数据,否则不能看到数据。最后必须使用Session.commit()方法提交事务
  参数二:acknowledgeMode表示签收模式
         Session.AUTO_ACKNOWLEDGE当消费者从receive或onMessage成都返回时,Session自动签收客户端的消息的收条。
         Session.CLIENT_ACKNOWLEDGE消费者调用消息(Message)的msg.acknowledge();方法签收消息。这种情况下,签收发生在Session层面,签收一个已消费的消息会自动的签收这个Session所有已消费消息的收条
         Session.DUPS_OK_ACKNOWLEDGE表示Session不必确保对传送消息的签收,它可能引起消息的重复,但降低了Session的开销,所以只有客户端能容重复消息才能使用。

三、MessageProducer
注:优先级需要activemq.xml配置


                        //一参	目标地址
			//二参	具体数据信息
			//三参	传送数据模式  :PERSISTENT和NON_PERSISTENT两种,不指定传送模式默认是持久性的。如果容忍消息丢失,使用非持久性消息可以改善性能和减少存储开销。
			//四参	优先级:从0-9十个级别,0-4是普通消息,5-9是加急消息。不指定默认为4.JMS不要求严格按照十个优先级发送消息,但必须保单次加急消息要先于普通消息到达,不保证顺序消费机制。
			//五参	消息过期时间:默认情况下,消息永不会过期。如果消息在特定周期内失去意义,那么可以设置过期时间,单位为毫秒。
			producer.send(destination, message, deliveryMode, priority, timeToLive);


四、消息的独占
   我们经常希望维持队列中的消息,按一定次序转发给消费者。然而当有多个JMS Session和消息消费者实例的从同一个队列中获取消息的时候,就不能保证消息顺序处理。因为消息被多个不同线程并发处理着。
   在ActiveMQ4.x中可以采用Exclusive Consumer或者Exclusive Queues,避免这种情况,Broker会从消息队列中,一次发送消息给一个消息消费者来保证顺序。
配置如下:
        queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
consumer = session.createConsumer(queue);
A.         当在接收信息的时候有一个或者多个备份接收消息者和一个独占消息者的同时接收时候,无论两者创建先后,在接收的时候,均为独占消息者接收。
B.         当在接收信息的时候,有多个独占消费者的时候,只有一个独占消费者可以接收到消息。
C.         当有多个备份消息者和多个独占消费者的时候,当所有的独占消费者均close的时候,只有一个备份消费者接到到消息。
备注:备份消费者为不带任何参数的消费者。

五,以前API示例
package com.mq.ActivemqAPI;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.spring.ActiveMQConnectionFactory;

/**
 * Hello world!
 *
 */
public class Sender {
    public static void main( String[] args ) throws Exception
    {
        //建立connectionFactory工厂对象,填入用户名、密码以及要连接的地址,均使用默认即可,默认端口为"tcp://localhost:61616"
    	ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    	
		//通过connectionFactory工厂对象创建connection连接,并且调用connection的start方法开启连接,connection默认是关闭的
		Connection connection = connectionFactory.createConnection("fu","fu");
    	connection.start();
    	
    	//通过connection对象创建session会话(上下文环境对象),用于接收消息,参一表示是否启用事务,参二表示签收模式,一般我们设置自动签收。
    	Session session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);
    	
    	//通过session创建destination对象,指的是一个客户端用来指定生产消息目标和消费消息的来源的对象。
    	//在p2p模式中,destination被称作Queue即队列,在pub/sub模式中,destination被称作Topic即主题。
    	Destination destination = session.createQueue("first");
    	
    	//通过session对象创建消息的发送/接收对象(生产者/消费者)MessageProducer/MessageConsumer
    	MessageProducer producer = session.createProducer(null);
    	
    	for (int i = 0; i < 50; i++) {
    		//使用JMS规范的TextMessage形式创建数据(通过session对象),并用MessageProducer的send方法发送对象。同理客户端使用receive方法进行接收数据。最后关闭connection连接。
			TextMessage msg = session.createTextMessage("消息内容"+i);
			//一参	目标地址
			//二参	具体数据信息
			//三参	传送数据模式  :PERSISTENT和NON_PERSISTENT两种,不指定传送模式默认是持久性的。如果容忍消息丢失,使用非持久性消息可以改善性能和减少存储开销。
			//四参	优先级:从0-9十个级别,0-4是普通消息,5-9是加急消息。不指定默认为4.JMS不要求严格按照十个优先级发送消息,但必须保单次加急消息要先于普通消息到达,不保证顺序消费机制。
			//五参	消息过期时间:默认情况下,消息永不会过期。如果消息在特定周期内失去意义,那么可以设置过期时间,单位为毫秒。
			producer.send(destination,msg);
		}
    	
    	
    	//提交事务
    	session.commit();
    	
    	//关闭连接
    	if(connection !=null){
    		connection.close();
    	}
    	
    	
    }
}




public class Receiver {

	public static void main(String[] args) throws Exception {

		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

	    Connection connection = connectionFactory.createConnection("fu","fu");

		connection.start();
        //消费端启用事务和签收模式不启作用
		Session session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);

		Destination destination = session.createQueue("first");
		// 通过session对象创建消息的发送/接收对象(生产者/消费者)MessageProducer/MessageConsumer
		MessageConsumer consumer = session.createConsumer(destination);

		while (true) {
			// 使用JMS规范的TextMessage形式创建数据(通过session对象),并用MessageProducer的send方法发送对象。同理客户端使用receive方法进行接收数据。最后关闭connection连接。
			TextMessage msg = (TextMessage) consumer.receive();
			
			// 手工签收消息
			msg.acknowledge();
			System.out.println("消费数据:" + msg.getText());
		}

	}

}








你可能感兴趣的:(ActiveMQAPI)