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模型传输数据

 

posted @ 2020-09-25 17:05  变体精灵  阅读(1963)  评论(0编辑  收藏  举报