ActiveMQ传输协议

ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM。
其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的标签之内。
在这里插入图片描述
在这里插入图片描述

Transmission Control Protocol(TCP)协议

1.这是默认的Broker配置,TCP的Client监听端口61616
2.在网络传输数据前,必须要先序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。
3.TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的。
4.TCP传输的的优点:
(4.1)TCP协议传输可靠性高,稳定性强
(4.2)高效率:字节流方式传递,效率很高
(4.3)有效性、可用性:应用广泛,支持任何平台
5.关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html

New I/O API Protocol(NIO)协议

1.NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的client调用和服务器端有更多的负载。
2.适合使用NIO协议的场景:
(2.1)可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议。
(2.2)可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。

3.NIO连接的URI形式:nio://hostname:port?key=value&key=value
4.关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html

小结

TCP默认的协议,性能相对可以
NIO基于TCP协议之上的,进行类扩展和优化,具有更高的性能

NIO案例演示

1,修改activemq.xml配置文件
<transportConnectors>
      <transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true" />
</transportConnectors>

如果你不特别指定ActiveMQ的网络监听端口,那么这些端口都讲使用BIO网络IO模型
所以为了首先提高单节点的网络吞吐性能,我们需要明确指定ActiveMQ网络IO模型。
如下所示:URI格式头以“nio”开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。
在这里插入图片描述
在这里插入图片描述

测试nio

生产者,消费者两端协议代码修改

生产者
package com.mq.nio;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * 消息生产者
 */
public class JmsProduce {
    public static final String ACTIVEMQ_URL = "nio://127.0.0.1:61618/";
    public static final String QUEUE_NAME = "Transport";
    public static void main(String[] args) throws JMSException {
        //创建工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);

        //通过连接工厂获得连接connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //创建会话 参数 1事务 2签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //创建目的地 是队列还是主题topic
        Queue queue = session.createQueue(QUEUE_NAME);

        //创建消失生产者
        MessageProducer messageProducer = session.createProducer(queue);
//        messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  //非持久化
        messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); //持久话
        //通过messageProducer给mq发送消息
        for(int i = 1;i<=3;i++){
            //创建消息 里面放消息内容
            TextMessage textMessage = session.createTextMessage("textMessage---" + i);
            //设置唯一标识
            textMessage.setStringProperty("c01","vip");
            //通过messageProducer发送给mq
            messageProducer.send(textMessage);
        }

        //关闭支援
        messageProducer.close();
        session.close();
        connection.close();
        System.out.println("****消息发送给mq****");

    }
}

消费者
package com.mq.nio;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * 消息消费者,同步阻塞方式
 */
public class JmsConsumerDemo01 {

    public static final String ACTIVEMQ_URL = "nio://127.0.0.1:61618/";
    public static final String QUEUE_NAME = "Transport";

    public static void main(String[] args) throws JMSException {
        System.out.println("2号消费者");
        //创建工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);

        //通过连接工厂获得连接connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //创建会话 参数 1事务 2签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //创建目的地 是队列还是主题topic
        Queue queue = session.createQueue(QUEUE_NAME);

        //创建消费者
        //从指定的队列中取消息
        MessageConsumer messageConsumer = session.createConsumer(queue);

        /**
         * 同步阻塞方式(.receive())
         * 订阅者或接受者messageConsumer的.receive()方法来接收消息
         * .receive()方法在能够接收到消息之前一直阻塞
         */
        while (true){
          //.receive() 一直等待mq中的消息
          TextMessage textMessage = (TextMessage)messageConsumer.receive();
          if(null != textMessage){
              System.out.println("******收到消息"+textMessage.getText());
          }else {
              break;
          }
        }
        messageConsumer.close();
        session.close();
        connection.close();
    }
}

结果

在这里插入图片描述

nio性能优化

上述代码问题
URL格式以NIO开头,代表这个端口使用TCP协议为基础的NIO网络模式。但是这样的设置方式,只能使这个端口支持Openwire协议.
我们怎么能让这个端口即支持NIO网络模型,又让他支持多个协议?
解决:
1,使用auto关键字

<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>

2,使用“+”符号来为端口设置多种特性
3,如果我们即需要使用莫一个端口支持NIO网络模型,又需要他支持多个协议

<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值