activemq的传输协议NIO

一.nio的配置

(1)代码块

<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true"/> 
</transportConnectors>

(2)打开配置文件

图片

(3)编译配置文件内容

图片

二.项目演示

1.消费者生产类

(1)代码块

package com.fengmo.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
 * 测试nio的生产者
 */
public class JmsProduce {
    //定制activemq的地址,注意tcp协议
    public static final String ACTIVEMQ_URL = "nio://192.168.83.131:61618"; //访问activemq的地址
    public static final String QUEUE_NAME = "queue01";  //队列名称
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂,获得连接connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3.创建session,第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4.创建目的地(具体是队列还是主题)
        Queue queue = session.createQueue(QUEUE_NAME);//参数为队列名称
        //5.创建消息的生产者
        MessageProducer messageProducer = session.createProducer(queue);
        messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);   //非持久化
        messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);   //持久化
        //6.通过使用messageProducer生产3条消息发送到MQ的队列里面
        for(int i = 0;i < 3;i++){
            //7.创建消息
            TextMessage textMessage = session.createTextMessage("msg----" + i);//理解一个字符串
            textMessage.setStringProperty("c01","这是对textMessage设置自定义属性");   //可选,设置自定义属性
            //8.通过messageProducer发送到activemq
            messageProducer.send(textMessage);
        }
        //8.关闭资源
        messageProducer.close();
        session.close();
        connection.close();
        System.out.println("消息发送完成");
    }
}

(2)范例

图片

图片

2.消费者消费类

(1)代码块

package com.fengmo.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
/**
 * 测试nio
 */
public class JmsConsumer {
    //定制activemq的地址,注意tcp协议
    public static final String ACTIVEMQ_URL = "nio://192.168.83.131:61618"; //访问activemq的地址
    public static final String QUEUE_NAME = "queue01";  //队列名称
    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂,获得连接connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3.创建session,第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4.创建目的地(具体是队列还是主题)
        Queue queue = session.createQueue(QUEUE_NAME);//参数为队列名称
        //5.创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
        //6.通监听的方式来消费消息
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                //判断message是否为空,并且是否属于textmessage的子类,TextMessage是可变
                if(null != message && message instanceof TextMessage)
                {
                    //注意:消息提供者的类型则强转什么类型:TextMessage
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        //消费消息,则需要解决异常
                        System.out.println("接收的消息是" + textMessage.getText());
                        //接受自定义的属性
                        System.out.println("接收的消息是" + textMessage.getStringProperty("c01"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        //7.使控制台保存工作
        System.in.read();   //细节:如果不加一直保持读取状态,则监听器无法消费消息
        //8.关闭资源
        messageConsumer.close();
        session.close();
        connection.close();
    }
}

(2)范例

图片

图片

图片

三.NIO的增强

1.问题

URI格式头以"nio"开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。但是这样的设置方式,只能使这个端口支持Openwire协议。

2.解决方案

nio配置多种协议。

3.activemq的配置文件修改

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&amp;org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50"/>

4.范例

图片

图片

5.测试类

(1)消息生产者

(1-1)代码块
package com.fengmo.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
 * 测试nio增强,生产者类
 */
public class JmsProduce_Tx {
    //定制activemq的地址,注意多种协议,生产者和消费者协议必须一致才能接收
//    public static final String ACTIVEMQ_URL = "tcp://192.168.83.131:61608"; //访问activemq的地址
//    public static final String ACTIVEMQ_URL = "nio://192.168.83.131:61608"; //访问activemq的地址
    public static final String ACTIVEMQ_URL = "auto://192.168.83.131:61608"; //访问activemq的地址
    public static final String QUEUE_NAME = "queue01";  //队列名称
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂,获得连接connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3.创建session,第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   //自动提交
        //4.创建目的地(具体是队列还是主题)
        Queue queue = session.createQueue(QUEUE_NAME);//参数为队列名称
        //5.创建消息的生产者
        MessageProducer messageProducer = session.createProducer(queue);
        //6.通过使用messageProducer生产3条消息发送到MQ的队列里面
        for(int i = 0;i < 3;i++){
            //7.创建消息
            TextMessage textMessage = session.createTextMessage("msg----" + i);//理解一个字符串
//            textMessage.setStringProperty("c01","这是对textMessage设置自定义属性");   //可选,设置自定义属性
            //8.通过messageProducer发送到activemq
            messageProducer.send(textMessage);
        }
        //8.关闭资源
        messageProducer.close();
//        session.commit();   //事务提交,注意:开启事务时,如果不提交事务,则消息会重复消息。
        session.close();
        connection.close();
        System.out.println("消息发送完成");
    }
}
(1-2)范例

图片

图片

(2)消息消费者

(2-1)代码块
package com.fengmo.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
/**
 * 测试nio增强
 */
public class JmsConsumer_Tx {
    //定制activemq的地址,注意多种协议,生产者和消费者协议必须一致才能接收
//    public static final String ACTIVEMQ_URL = "tcp://192.168.83.131:61608"; //访问activemq的地址
//        public static final String ACTIVEMQ_URL = "nio://192.168.83.131:61608"; //访问activemq的地址
    public static final String ACTIVEMQ_URL = "auto://192.168.83.131:61608"; //访问activemq的地址
    public static final String QUEUE_NAME = "queue01";  //队列名称
    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂,按照给定的url地址,采用默认用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂,获得连接connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3.创建session,第一个参数事务,第二个参数签收
//        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);       //自动提交
//        Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);    //手动提交
        Session session = connection.createSession(true, Session.DUPS_OK_ACKNOWLEDGE); //允许重复消息
        //4.创建目的地(具体是队列还是主题)
        Queue queue = session.createQueue(QUEUE_NAME);//参数为队列名称
        //5.创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
        //6.通监听的方式来消费消息
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                //判断message是否为空,并且是否属于textmessage的子类,TextMessage是可变
                if(null != message && message instanceof TextMessage)
                {
                    //注意:消息提供者的类型则强转什么类型:TextMessage
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        //6.1 消费消息,则需要解决异常
                        System.out.println("接收的消息是" + textMessage.getText());
                        //接受自定义的属性
//                        System.out.println("接收的消息是" + textMessage.getStringProperty("c01"));
                        //6.2 手动签收
                        textMessage.acknowledge();      //开启事务时,则该签收方法可不写【事务提交自动签收】。非事务时,需要写该行代码进行提交
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        //7.使控制台保存工作
        System.in.read();   //细节:如果不加一直保持读取状态,则监听器无法消费消息
        //8.关闭资源
        messageConsumer.close();
        session.commit();   //事务提交
        session.close();
        connection.close();
    }
}
(2-2)范例

图片

图片

图片

四.源码

demo02.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值