• ActiveMQ支持的协议


    一、ActiveMQ支持的协议有哪些?

      1、ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM.

      2、配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中<transportConnectors>标签之内.

      3、activemq传输协议的官方文档:http://activemq.apache.org/configuring-transports.html

      

      4、在上文给出的配置信息中,URI描述信息的头部都是采用协议名称.例如:描述amqp协议的监听端口时,采用的URI描述格式为“amqp://······”;描述Stomp协议的监听端口时,采用URI描述格式为“stomp://······”;唯独在进行openwire协议描述时,URI头却采用的“tcp://······”.这是因为ActiveMQ中默认的消息协议就是openwire.

      5、除了tcp和nio协议,其他的了解就行.各种协议有各自擅长该协议的中间件,工作中一般不会使用activemq去实现这些协议.如:mqtt是物联网专用协议,采用的中间件一般是mosquito. ws是websocket的协议,是和前端对接常用的,一般在java代码中内嵌一个基站(中间件).stomp好像是邮箱使用的协议的,各大邮箱公司都有基站(中间件).
      注意:协议不同,我们的代码都会不同.

      6、相关协议简介

     

    二、TCP协议

      1、TCP协议Transmission Control Protocol(TCP)是默认的.TCP的Client监听端口61616

      2、在网络传输数据前,必须要先序列化数据,消息是通过一个叫wire protocol的来序列化成字节流.

      3、TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的.

      4、CP传输的的优点:

        TCP协议传输可靠性高,稳定性强

        高效率:字节流方式传递,效率很高.

        有效性、可用性:应用广泛,支持任何平台.

      5、关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/tcp-transport-reference

    三、NIO(New I/O API Protocol(NIO))

      1、NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作.它允许开发人员对同一资源可有更多的client调用和服务器端有更多的负载.

      2、适合使用NIO协议的场景:

        可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的.因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议.

        可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能.

        NIO连接的URI形式:nio://hostname:port?key=value&key=value

      3、关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html

    四、NIO协议测试案例

    ActiveMQ这些协议传输的底层默认都是使用BIO网络的IO模型。只有当我们指定使用nio才使用NIO的IO模型。ActiveMQ这些协议传输的底层默认都是使用BIO网络的IO模型,只有当我们指定使用nio才使用NIO的IO模型.具体步骤如下:

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

      

      2、保存后,启动activeMQ

      3、重启之后,可以看到Connection这里多了一个 Connector nio

      4、Spring配置文件

      

      5、生产者

    @Service
    public class JmsProducer {
        @Autowired
        private JmsTemplate jmsTemplate;
    
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/conf/spring/applicationContext.xml");
            JmsProducer jmsProducer = (JmsProducer) context.getBean("jmsProducer");
    
            for (int i = 1; i < 7; i++) {
                jmsProducer.jmsTemplate.send(new MessageCreator() {
                    @Override
                    public Message createMessage(Session session) throws JMSException {
                        TextMessage textMessage = session.createTextMessage(
                                "queue:::" + UUID.randomUUID().toString().replace("-", ""));
                        return textMessage;
                    }
                });
            }
            System.out.println("JmsProducer send message ok!!!");
        }
    }

      6、消费者

    @Service
    public class JmsConsumer {
        @Autowired
        private JmsTemplate jmsTemplate;
    
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/conf/spring/applicationContext.xml");
            JmsConsumer jmsConsumer = (JmsConsumer) context.getBean("jmsConsumer");
            while (true) {
                String textMessage = (String) jmsConsumer.jmsTemplate.receiveAndConvert();
                System.out.println("接收到的消息是:" + textMessage);
            }
        }
    } 

      7、后台管理界面

      8、控制台

    五、NIO协议增强

      上面是Openwire协议传输底层使用NIO网络IO模型.如何让其他协议传输底层也使用NIO网络IO模型呢?

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

      auto:它会识别我们使用的是什么协议,然后自己去匹配对应的传输协议.

      nio:使用NIO网络,IO模型传输数据

     

  • 相关阅读:
    课后作业10.13
    大道至简:软件工程实践者的思想 读后感
    课程作业01
    动手动脑10.13
    动手动脑
    js矢量图类库:Raphaël—JavaScript Library
    OSGi bundle之间互相通信的方法
    OSGi bundle 与 fragment
    Spring.DM web 开发环境搭建
    Spring.DM版HelloWorld
  • 原文地址:https://www.cnblogs.com/xiaomaomao/p/13731275.html
Copyright © 2020-2023  润新知