ActiveMQ(二)实战

1. 实现点对点通讯模式


使用ActiveMQ完成点对点(p2p)通讯模式

<!-- ActiveMQ 技术 -->
<dependency>
	<groupId>org.apache.activemq</groupId>
	<artifactId>activemq-core</artifactId>
	<version>5.7.0</version>
</dependency>

生产者

public class Producer {

    /** mq通讯地址 */
    private final static String URL = "tcp://localhost:61616";

    /** 队列名称 */
    private final static String QUEUENAME = "my_queue";
    
    public static void main(String[] args) throws JMSException {
        
        /** 创建ActiveMQFactory */
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        
        /** 创建连接 */
        Connection cnnection = factory.createConnection();
        
        /** 启动连接 */
        cnnection.start();
        
        /** 创建session 不开启事务,自动签收模式 */
        Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
        /** 创建一个目标 */
        Queue queue = session.createQueue(QUEUENAME); 
        
        /** 创建生产者 */
        MessageProducer producer = session.createProducer(queue);
        for (int i = 0; i < 10; i++) {
            /** 创建消息 */
            TextMessage textMessage = session.createTextMessage("消息" + i);
            /** 发送消息 */
            producer.send(textMessage);
            System.out.println(textMessage.toString());
        }
        /** 关闭连接 */
        cnnection.close();
    }
}

消费者

public class Consumer {
    
    /** mq通讯地址 */
    private final static String URL = "tcp://localhost:61616";

    /** 队列名称 */
    private final static String QUEUENAME = "my_queue";
    
    public static void main(String[] args) throws JMSException {
        /** 创建ActiveMQFactory */
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        
        /** 创建连接 */
        Connection connection = factory.createConnection();
        
        /** 启动连接 */
        connection.start();
        
        /** 创建Session 不开启事务,自动签收模式 */
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  
        /** 创建一个目标 */
        Queue queue = session.createQueue(QUEUENAME);
        
        /** 创建生产者 */
        MessageConsumer createConsumer = session.createConsumer(queue);
        createConsumer.setMessageListener(new MessageListener() {
            
            @Override
            public void onMessage(Message message) {
                try {
                    TextMessage textMessage = (TextMessage) message;
                    System.out.println("消费者消费消息:" + textMessage.getText());
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        });
        // 连接先不要关闭
    }
}

2. JMS消息可靠机制


ActiveMQ消息签收机制:
客户端成功接收一条消息的标志是一条消息被签收,成功答应。
消息的签收情形分两种:

  1. 带事务的session
    如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。
  2. 不带事务的session
    不带事务的session的签收方式,取决于session的配置。

ActiveMQ支持一下三种模式:

  • Session.AUTO_ACKNOWLEDGE 消息自动签收
  • Session.CLIENT_ACKNOWLEDGE 客戶端调用acknowledge方法手动签收 textMessage.acknowledge();//手动签收
  • Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息只有被确定之后,才认为已经被成功地消费了,消息的成功消费通常包含三个阶段:客户接受消息、客户处理消息和消息被确认。在事务性会话中,当一个事物被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。改参数有三个可选值:
    在这里插入图片描述
    Number Of Consumers 消费者 这个是消费者端的消费者数量
    Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数
    Messages Enqueued 进入队列的消息 进入队列的总数量,包括出队列的。 这个数量只增不减
    Messages Dequeued 出了队列的消息 可以理解为是消费这消费掉的数量

3. 发布订阅


生产者:

public class Producter2 {
	/**
	 * mq通讯地址
	 */
	private final static String URL = "tcp://localhost:61616";
	/**
	 * 主题名称
	 */
	private final static String TOPICNAME = "my_topic";

	public static void main(String[] args) throws JMSException {
		// 1.创建ActiveMQFactory
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
		// 2.创建连接
		Connection cnnection = factory.createConnection();
		// 3.启动连接
		cnnection.start();
		// 4.创建Session 不开启事务,自动签收模式
		Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 5.创建一个目标
		Topic createTopic = session.createTopic(TOPICNAME);
		// 6.创建生产者
		MessageProducer producer = session.createProducer(createTopic);
		// 设置消息持久化
		producer.setDeliveryMode(DeliveryMode.PERSISTENT);
		for (int i = 1; i <= 10; i++) {
			// 7.创建消息
			TextMessage textMessage = session.createTextMessage("消息" + i);
			// 8.发送消息
			producer.send(textMessage);
			System.out.println(textMessage.toString());
		}
		// 9.关闭连接
		cnnection.close();
	}

}

消费者:

public class Consumer2 {
	/**
	 * mq通讯地址
	 */
	private final static String URL = "tcp://localhost:61616";
	/**
	 * 主题名称
	 */
	private final static String TOPICNAME = "my_topic";

	public static void main(String[] args) throws JMSException {
		// 1.创建ActiveMQFactory
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
		// 2.创建连接
		Connection cnnection = factory.createConnection();
		// 3.启动连接
		cnnection.start();
		// 4.创建Session 不开启事务,自动签收模式
		Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 5.创建一个目标
		Topic topic = session.createTopic(TOPICNAME);
		// 6.创建生产者
		MessageConsumer createConsumer = session.createConsumer(topic);
		createConsumer.setMessageListener(new MessageListener() {

			public void onMessage(Message message) {
				try {
					TextMessage textMessage = (TextMessage) message;
					System.out.println("消费者消费消息:" + textMessage.getText());
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
		});
		// 先不要关闭连接
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值