ActiveMQ-01

JMS基本概念
○ Point-to-Point(P2P) //点对点
○ Publish/Subscribe(Pub/Sub) //发布订阅模型
P2T

  1. 涉及到的概念

  2. 消息队列(Queue)

  3. 发送者(Sender)
  4. 接收者(Receiver)
  5. 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
  6. P2P的特点
  7. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  8. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
  9. 接收者在成功接收消息之后需向队列应答成功
    如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。
    Pub/Sub模式图

  10. 涉及到的概念

  11. 主题(Topic)

  12. 发布者(Publisher)
  13. 订阅者(Subscriber)
    客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
  14. Pub/Sub的特点
  15. 每个消息可以有多个消费者
  16. 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
  17. 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
    如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

1安装

解压

http://127.0.0.1:8161/admin/
admin admin

Messages Enqueued:表示生产了多少条消息,记做P
Messages Dequeued:表示消费了多少条消息,记做C
Number Of Consumers:表示在该队列上还有多少消费者在等待接受消息
Number Of Pending Messages:表示还有多少条消息没有被消费,实际上是表示消息的积压程度,就是P-C
生产者:

package com.sds.activemq;


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {
    public static void main(String[] args) throws JMSException {
        // TODO Auto-generated method stub
        //创建ConnectionFactory连接工厂
        ConnectionFactory conntionFactory=new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        //创建Connection
        Connection connection=conntionFactory.createConnection();
        connection.start(); 
        //创建Session
        Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //创建Destination 在ptp模式下是queue,在pub/sub下是topic
        Destination destination=session.createQueue("first");
        //创建MessageProducer 发送消息的生产者/接受消息的消费者 
        MessageProducer producer=session.createProducer(destination);
        //设置持久化方式 如果非持久化,那么意味着MQ的重启会导致消息的丢失
        //如果持久化到kahdb/leveldb/jdbc方式的话,意味着消息持久化
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        //定义消息对象,并发送
        TextMessage message=session.createTextMessage();
        message.setText("hello world.");
        producer.send(message);
        System.out.println(message.toString());
        //释放连接
        if(connection != null) {
            connection.close();
        }
    }

}

消费者:

package com.sds.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver {

    public static void main(String[] args) throws JMSException {
        ConnectionFactory conntionFactory=new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        Connection connection=conntionFactory.createConnection();
        connection.start();
        Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        Destination destination=session.createQueue("first");
        MessageConsumer consumer=session.createConsumer(destination);
        TextMessage message=(TextMessage)consumer.receive();
        String str=message.getText();
        System.out.println(str);

    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值