ActiveMQ的代码使用

通过代码使用

1. 点对点模式
生产者代码
import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * @author 生产者
 */
public class Producer {

    //默认连接用户名
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    //默认连接密码
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    //默认连接地址
    private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) {
        // 默认连接用户名
        String USERNAME = ActiveMQConnection.DEFAULT_USER;
        // 默认连接密码
        String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
        // 默认连接地址
        String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
        // 不是默认的地址的时候,需要这样写
        // String BROKER_URL = "failover://tcp://120.79.150.160:61616";
        // 1.创建一个连接工厂对象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
        // 第二种方式
        // ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        try {
            // 2.使用工厂对象来创建一个Connection对象
            Connection connection = connectionFactory.createConnection();
            // 3.开启连接,调用Connection对象的start方法
            connection.start();
            // 4.创建一个Session对象
            // 第一个参数:是否开启事务,如果开启事务true带二个参数无意义,一般不开启事务false
            // 第二个参数:应答模式。一般自动应答或者手动应答。一般自动应答
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 5.使用Session对象创建一个Destination对象。两种形式queue,topic,现在应该使用queue
            Destination destination = session.createQueue("MyFirstQueueTest");
            // 6.使用Session对象创建一个Producer对象
            MessageProducer producer = session.createProducer(destination);
            // 设置不持久化,此处学习,实际根据项目决定,可以不设置
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            // 7.创建一个Message对象,可以使用Message
            TextMessage message = session.createTextMessage("woshi ceshi xiaoxi");
            // Message message = session.createTextMessage("woshi ceshi xiaoxi");
            // 8.发送消息
            producer.send(message);
            // 提交事务,当应答模式为事务的时候才需要提交
            session.commit();
            // 9.关闭资源
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
消费者代码
public void consumer() throws Exception{
    //1.创建连接工厂
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    //2.创建连接
    Connection connection = factory.createConnection();
    //3.开启连接
    connection.start();
    //4.创建session对象
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5.创建目的地,需要跟生产者发送消息的目的地一致不然不能接收到消息
    Queue queue = session.createQueue("MyFirstQueueTest");
    //使用Session对象创建一个消费者对象
    MessageConsumer consumer = session.createConsumer(queue);
    //接收消息
    consumer.setMessageListener(new MessageListener() {

        public void onMessage(Message message) {

            TextMessage textMessage = (TextMessage)message;
            try {
                String text = textMessage.getText();
                System.out.println(text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    });
    //等待接收消息,消费完了就没了
    System.in.read();//等待我们敲击键盘才会向下执行
    //关闭资源
    consumer.close();
    session.close();
    connection.close();
}

PS:创建session的过程都是一样的,只是后面的操作不一样

2. 广播模式(和PTP模式的区别就是session创建的是Topic不是Destination)
生产者代码
public void topicProducer() throws Exception{
    //1.创建连接工厂
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    //2.创建连接
    Connection connection = factory.createConnection();
    //3.开启连接
    connection.start();
    //4.创建session对象
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5.创建目的地Destination,该模式创建的是Topic
    Topic topic = session.createTopic("MyFirstQueueTest");
    //6.创建生产者
    MessageProducer producer = session.createProducer(topic);
    //7.创建消息
    TextMessage message = session.createTextMessage("hello topic");
    //8.发送消息
    producer.send(message);
    //9.关闭资源
    producer.close();
    session.close();
    connection.close();
}
消费者代码
public void topicConsumer() throws Exception{
    //1.创建连接工厂
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    //2.创建连接
    Connection connection = factory.createConnection();
    //3.开启连接
    connection.start();
    //4.创建session对象
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5.创建目的地Destination,该模式创建的是Topic
    Topic topic = session.createTopic("MyFirstQueueTest");
    //6.创建消费者
    MessageConsumer consumer = session.createConsumer(topic);
    //7.接收消息
    consumer.setMessageListener(new MessageListener() {

        @Override
        public void onMessage(Message message) {
            TextMessage textMessage = (TextMessage)message;
            //获取信息并打印
            try {
                String text = textMessage.getText();
                System.out.println(text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    });
    System.out.println("----消费者1准备就绪----");
    System.in.read();
    //9.关闭资源
    consumer.close();
    session.close();
    connection.close();
}
3.设置消息应答的模式

设置应答模式(就是ack消息的方式,自动消费,还是手动通过代码调用来消费等)

//第一个参数:是否开启事务,如果开启事务true带二个参数无意义(Session.SESSION_TRANSACTED模式),一般不开启事务false
//第二个参数:应答模式。一般自动应答或者手动应答。一般自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

几种应答模式

Session.AUTO_ACKNOWLEDGE 自动应答
Session.CLIENT_ACKNOWLEDGE 手动应答
Session.DUPS_OK_ACKNOWLEDGE 延迟提交
Session.SESSION_TRANSACTED 事务

手动消费消息

如果模式为CLIENT_ACKNOWLEDGE模式,即手动应答消费
在监听器中重写的onMessage的入参message需要在方法体中手动ack

message.acknowledge();

参考文章:
https://www.jianshu.com/p/9769a1749778
https://blog.csdn.net/hyhanyu/article/details/79816279

你可能感兴趣的:(MQ)