目录

  • activemq总结
  • 消息组成
  • 1.消息头
  • 2.消息体
  • 3.消息属性
  • 消息可靠性
  • 1.持久化
  • 2.事务
  • 3.签收
  • 根据配置文件启动 activeMQ
  • Java硬编码启动自己mq


activemq总结

消息组成

1.消息头

在发送消息时可以设置消息头的属性

activemq消息大小限制 activemq怎么保证消息不重复_activemq消息大小限制


常用方法:

JMSDestination:发送消息的目的地主要指queue和topic

JMSDeliveryMode:持久和非持久

JMSExpiration:过期时间(0表示永不过期)

JMSPriority:优先级(0-4普通消息,5-9加急消息,默认4)

JMSMessageID:唯一识别(mq有自己生成的)send方法也提供了 一些设置

activemq消息大小限制 activemq怎么保证消息不重复_配置文件_02

2.消息体

五种格

activemq消息大小限制 activemq怎么保证消息不重复_配置文件_03

3.消息属性

对消息头和消息体的加强。可以对数据进行识别、去重、标识。

mq提供了设置各种属性值的方法。

activemq消息大小限制 activemq怎么保证消息不重复_System_04

消息可靠性

1.持久化

activemq消息大小限制 activemq怎么保证消息不重复_持久化_05


MQ默认是持久化

topic持久化
生产者

public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        //创建生产者
        MessageProducer producer = session.createProducer(topic);
        //持久化设置
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        //向mq发送三条消息
        for(int i=0;i<3;i++){
            TextMessage textMessage = session.createTextMessage("msg------"+i);
            producer.send(textMessage);
        }
        producer.close();
        session.close();
        connection.close();
        System.out.println("------------------------------消息发送完成");
    }

消费者

public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException, IOException {
        System.out.println("我是1号消费者");
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.setClientID("1号");
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        TopicSubscriber durableSubscriber = session.createDurableSubscriber(topic, "remark------------------------");
        connection.start();
        Message receive = durableSubscriber.receive();
        while (null!=receive){
            TextMessage textMessage = (TextMessage) receive;
            System.out.println("监听持久化消息。。。。。。。。。。"+textMessage.getText());
            receive=durableSubscriber.receive();
        }
        session.close();
        connection.close();
    }

注意:必须先启动消费者,只有消费者先注册后,当消费者宕机后重新连接才可以接受到所有消息。否则只能接收到订阅后的数据。

2.事务

事务偏生产者

//第一个参数事务,第二个参数签收
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

开启事务后必须提交,否则mq接受不到消息

//关闭资源
        producer.close();
        session.commit(); //事务提交
        session.close();
        connection.close();

生产者开启事务

public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        //创建生产者
        MessageProducer producer = session.createProducer(topic);
        //持久化设置
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        try {
            //向mq发送三条消息
            for(int i=0;i<10000;i++){
                TextMessage textMessage = session.createTextMessage("msg------"+i);
                producer.send(textMessage);
            }
            //关闭资源
            producer.close();
            session.commit();
            session.close();
            connection.close();
            System.out.println("------------------------------消息发送完成");
        } catch (Exception e){
            e.printStackTrace();
            session.rollback();
        }finally {

        }
    }

消费者开启事务

注意:消费者开启事务后如果事务没有提交,当消费者重新连接mq后消息会重复消费。
总结
开启事务的优点:当生产者数据发送到一半时出现异常可以进行回滚

3.签收

签收偏消费者

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

四种签收类型

activemq消息大小限制 activemq怎么保证消息不重复_配置文件_06


AUTO_ACKNOWLEDGE:自动签收

CLIENT_ACKNOWLEDGE:手动签收

DUPS_OK_ACKNOWLEDGE:允许部分重复签收

SESSION_TRANSACTED:事务级

总结

1.消费者开起手动签收,如果没有确认签收,消费者下次连接会重复消费。

2.开启事务后签收将自动签收,即使签收成功,如果事务没有提交还是会重复消费

根据配置文件启动 activeMQ

在bin目录下执行性下面命令
./activemq start xbeen:file:文件地址(例如 ./activemq start xbean:file:…/conf/activemq.xml)

Java硬编码启动自己mq

public static void main(String[] args) throws Exception {
        BrokerService brokerService = new BrokerService();
        brokerService.setUseJmx(true);
       brokerService.addConnector("tcp://localhost:61616");
        brokerService.start();
    }