Centos7环境下消息队列之ActiveMQ实战

Activemq介绍

对于消息的传递有两种类型:apache

一种是点对点的,即一个生产者和一个消费者一一对应;服务器

另外一种是发布/订阅模式,即一个生产者产生消息并进行发送后,能够由多个消费者进行接收。session

JMS定义了五种不一样的消息正文格式,以及调用的消息类型,容许你发送并接收以一些不一样形式的数据,提供现有消息格式的一些级别的兼容性。tcp

  · StreamMessage -- Java原始值的数据流ide

  · MapMessage--一套名称-值对spa

  · TextMessage--一个字符串对象3d

  · ObjectMessage--一个序列化的 Java对象code

  · BytesMessage--一个字节的数据流对象

Activemq安装

第一步: ActiveMQ 的压缩包上传到Linux系统。blog

第二步:解压缩。

第三步:启动。

使用bin目录下的activemq命令启动:

[root@localhost bin]# ./activemq start

关闭:

[root@localhost bin]# ./activemq stop

查看状态:

[root@localhost bin]# ./activemq status

进入管理后台

http://192.168.176.130:8161/admin/

用户名:admin

密码:admin

JMQ的两种消息模式

消息列队有两种消息模式,一种是点对点的消息模式,还有一种就是订阅的模式.

点对点的消息模式

    点对点的模式主要创建在一个队列上面,当链接一个列队的时候,发送端不须要知道接收端是否正在接收,能够直接向ActiveMQ发送消息,发送的消息,将会先进入队列中,若是有接收端在监听,则会发向接收端,若是没有接收端接收,则会保存在activemq服务器,直到接收端接收消息,点对点的消息模式能够有多个发送端,多个接收端,可是一条消息,只会被一个接收端给接收到,哪一个接收端先连上ActiveMQ,则会先接收到,然后来的接收端则接收不到那条消息. 

订阅模式

    订阅/发布模式,一样能够有着多个发送端与多个接收端,可是接收端与发送端存在时间上的依赖,就是若是发送端发送消息的时候,接收端并无监听消息,那么ActiveMQ将不会保存消息,将会认为消息已经发送,换一种说法,就是发送端发送消息的时候,接收端不在线,是接收不到消息的,哪怕之后监听消息,一样也是接收不到的。这个模式还有一个特色,那就是,发送端发送的消息,将会被全部的接收端给接收到,不相似点对点,一条消息只会被一个接收端给接收到。

jar包添加到工程中

使用5.11.2版本的jar

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-all</artifactId>
</dependency>

点对点的实现代码

@Test
    public void testQueueProducer() throws Exception {
        //一、建立一个链接工厂对象,须要指定服务的ip及端口。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.176.130:61616");
        //二、使用工厂对象建立一个Connection对象。
        Connection connection = connectionFactory.createConnection();
        //三、开启链接,调用Connection对象的start方法。
        connection.start();
        //四、建立一个Session对象。
        //第一个参数:是否开启事务。若是true开启事务,第二个参数无心义。通常不开启事务false。
        //第二个参数:应答模式。自动应答或者手动应答。通常自动应答。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //五、使用Session对象建立一个Destination对象。两种形式queue、topic,如今应该使用queue
        Queue queue = session.createQueue("test-queue");
        //六、使用Session对象建立一个Producer对象。
        MessageProducer producer = session.createProducer(queue);
        //七、建立一个Message对象,可使用TextMessage。
        /*TextMessage textMessage = new ActiveMQTextMessage();
        textMessage.setText("hello Activemq");*/
        TextMessage textMessage = session.createTextMessage("hello activemq");
        //八、发送消息
        producer.send(textMessage);
        //九、关闭资源
        producer.close();
        session.close();
        connection.close();
    }
    
    @Test
    public void testQueueConsumer() throws Exception {
        //建立一个ConnectionFactory对象链接MQ服务器
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.176.130:61616");
        //建立一个链接对象
        Connection connection = connectionFactory.createConnection();
        //开启链接
        connection.start();
        //使用Connection对象建立一个Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //建立一个Destination对象。queue对象
        Queue queue = session.createQueue("test-queue");
        //使用Session对象建立一个消费者对象。
        MessageConsumer consumer = session.createConsumer(queue);
        //接收消息
        consumer.setMessageListener(new MessageListener() {
            
            @Override
            public void onMessage(Message message) {
                //打印结果
                TextMessage textMessage = (TextMessage) message;
                String text;
                try {
                    text = textMessage.getText();
                    System.out.println(text);
                } catch (JMSException e) {
                    e.printStackTrace();
                }
                
            }
        });
        //等待接收消息
        System.in.read();
        //关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
View Code

订阅/发布模式的实现代码

    @Test
    public void testTopicProducer() throws Exception {
        //一、建立一个链接工厂对象,须要指定服务的ip及端口。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.176.130:61616");
        //二、使用工厂对象建立一个Connection对象。
        Connection connection = connectionFactory.createConnection();
        //三、开启链接,调用Connection对象的start方法。
        connection.start();
        //四、建立一个Session对象。
        //第一个参数:是否开启事务。若是true开启事务,第二个参数无心义。通常不开启事务false。
        //第二个参数:应答模式。自动应答或者手动应答。通常自动应答。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //五、使用Session对象建立一个Destination对象。两种形式queue、topic,如今应该使用topic
        Topic topic = session.createTopic("test-topic");
        //六、使用Session对象建立一个Producer对象。
        MessageProducer producer = session.createProducer(topic);
        //七、建立一个Message对象,可使用TextMessage。
        /*TextMessage textMessage = new ActiveMQTextMessage();
        textMessage.setText("hello Activemq");*/
        TextMessage textMessage = session.createTextMessage("topic message");
        //八、发送消息
        producer.send(textMessage);
        //九、关闭资源
        producer.close();
        session.close();
        connection.close();
    }
    
    @Test
    public void testTopicConsumer() throws Exception {
        //建立一个ConnectionFactory对象链接MQ服务器
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.176.130:61616");
        //建立一个链接对象
        Connection connection = connectionFactory.createConnection();
        //开启链接
        connection.start();
        //使用Connection对象建立一个Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //建立一个Destination对象。topic对象
        Topic topic = session.createTopic("test-topic");
        //使用Session对象建立一个消费者对象。
        MessageConsumer consumer = session.createConsumer(topic);
        //接收消息
        consumer.setMessageListener(new MessageListener() {
            
            @Override
            public void onMessage(Message message) {
                //打印结果
                TextMessage textMessage = (TextMessage) message;
                String text;
                try {
                    text = textMessage.getText();
                    System.out.println(text);
                } catch (JMSException e) {
                    e.printStackTrace();
                }
                
            }
        });
        System.out.println("topic消费者3启动。。。。");
        //等待接收消息
        System.in.read();
        //关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
View Code
相关文章
相关标签/搜索