ActiveMQ传输协议简介_14

一、ActiveMQ传输协议简介

ActiveMQ支持的client-broker通信协议有:TCP、  NIO、 UDP 、SSL、 Http(s)、 VM,其中配置Transport Connector的文件在activeMQ安装目录的conf/activemq.xml中的<transportConnectors>标签内

<transportConnectors>
    <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

可以看到ActiveMQ支持的协议,默认是tcp协议,这里的name用的openwire是因为采用的消息协议是openwire。不同的配置,MQ的性能是不一样的

在上文给出的配置信息中

URI描述信息的头部都是采用协议名称,例如

描述amqp协议的监听端口时,采用的URI描述格式为“amqp//......”;

描述Stomp协议的监听端口时,采用的URI描述格式为“stomp://......”

唯独在进行openwire 协议描述时,URI头却采用的“tcp://......” 这是因为ActiveMQ中默认的消息协议就是openwire.

进入ActiveMQ的管理界面,点击Connections标签,可以看到几种连接方式,和activemq.xml里的一一对应。

二、各种协议的介绍

2.1 TCP(Transmission Control Protocol):

         这是Broker默认的配置,TCP的Client监听端口是61616。
         在网络传输数据前,必须进行序列化数据,消息通过一个叫wire protocol的协议序列化成字节流。
         TCP连接的URI形式如:tcp://hostname:port?key=value,后面的参数是可选的 。
         TCP传输的优点:
                  TCP协议传输可靠,稳定性强。
                  高效性:字节流方式传递,效率很高。
                  有效性、可用性:应用广泛,支持任何平台。
          关于Transport协议的配置参数,参见官网:http://activemq.apache.org/tcp-transport-reference
2.2NIO(New I/O Protocol):

         NIO协议和TCP协议类似,但是NIO更侧重于底层访问操作。它允许开发人员对同一资源可以有更多的Client调用和服务端有更多的负载。
         适合使用NIO协议的场景:
         可能有大量的Client连接到Broker上,一般情况下,大量Client连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程运行,所以建议使用NIO协议。
          可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。
          NIO连接的URI形式:nio://hostname:port?key=value。
         Transport Connector配置示例,参考官网:http://activemq.apache.org/nio-transport-reference
          上面的TCP和NIO需要掌握,下面的只需要了解即可,实际工作中用的不多,而且编码方式上会有不同。

2.3AMQP(Advanced Message Queuing Protocol):

一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件限制。

        具体配置见官网:http://activemq.apache.org/amqp

 2.4STOMP(Streaming Text Orientated Message Protocol):

           流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息中间件)设计的简单文本协议。

           具体配置见官网:http://activemq.apache.org/stomp

2.5 SSL(Secure Sockets Protocol):

           连接的URL形式:ssl://hostname:port?key=value。
           具体配置见官网:http://activemq.apache.org/ssl-transport-reference
2.6MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)

          是IBM开发的一个即时通讯协议,也可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

具体配置见官网:http://activemq.apache.org/mqtt
 

三、ActiveMQ的传输协议之NIO

NIO比TCP提供了更高的性能,我们根据官网的介绍,尝试将协议改成NIO的方式。

凡是修改,先做备份,执行命令cp activemq.xml activemq.xml.bak将activemq.xml备份出来一份。

在bin目录下执行命令./activemq stop停止ActiveMQ服务。

在activemq.xml的transportConnectors结点最后加上一个transportConnector结点,注意端口号是61618。

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

         在bin目录下执行命令./activemq start启动ActiveMQ服务,访问ActiveMQ的管理界面,点击Connections标签查看,发现多了一个nio。修改如图中的红色框中的内容,前台效果如下图


验证的生产者代码

public class JmsProduce {

//        public static final String ACTIVEMQ_URL = "tcp://10.5.96.48:61616";
    public static final String ACTIVEMQ_URL = "nio://10.5.96.48:61618";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[]args) throws JMSException {
        //1.创建连接工厂
        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 .创建目的地(具体是队列还是主题topic)
        Queue queue = session.createQueue(QUEUE_NAME);
        //5. 创建消息的生产者
        MessageProducer messageProducer = session.createProducer(queue);
        //消息的持久化设置(现在是非持久)
        messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
        //6.通过使用messageProducer 生产3条消息发送到队列里面
        for (int i = 0; i <3 ; i++) {
            // 7.创建消息
            TextMessage textMessage = session.createTextMessage("Msg---" + i);
            //8.消息生产者发送给mq
            messageProducer.send(textMessage);
        }
        //9.关闭资源 顺着开启,倒着关闭
        messageProducer.close();
        session.close();
        connection.close();

        System.out.println("**** 消息发布到MQ完毕 ****");
    }

}

验证的消费者代码

public class JmsConsumer {

//   public static final String ACTIVEMQ_URL = "tcp://10.5.96.48:61616";
    public static final String ACTIVEMQ_URL = "nio://10.5.96.48:61618";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[]args) throws JMSException, IOException {
        System.out.println("我是2号消费者");
        //1.创建连接工厂
        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.创建目的地(具体是队列还是主题Topic)
        Queue queue = session.createQueue(QUEUE_NAME);
        //创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
     
        while(true){
            TextMessage textMessage =  (TextMessage) messageConsumer.receive(4000);
            if( null !=textMessage ){
                System.out.println("***消费者受到消息:" + textMessage.getText());
            }else{
                break;
            }
        }
        messageConsumer.close();
        session.close();
        connection.close();
    }
}

先运行生产者,在运行消费者,可以在控制台看到打印的日志信息

四、ActiveMQ的传输协议之NIO加强

         前面配置文件中的nio是以TCP协议为基础的NIO网络IO模型,但是这样的配置,只能使这个端口支持Openwire协议。怎么让这个端口支持NIO网络IO模型,又支持多个协议呢?

使用命令./activemq stop停止ActiveMQ。进入config目录下,修改activemq.xml配置文件。去掉之前的nio配置,加上这一行配置。
 

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

        保存并启动ActiveMQ。访问ActiveMQ的管理界面,找到Connections标签,可以看到有一个auto+nio的项,说明此时配置成功了。将生产者和消费者中的ACTIVEMQ_URL改成nio://hostname:61608即可运行。代码前面的可以复用

         如果此时,将nio改成tcp,端口号不变,保持61608,再次运行,发现还是可以正常运行的,这就是我们配置了auto的效果,ActiveMQ为我们自动适配相应的协议。

         这里常用的就是TCP和NIO,其他的协议在实现的代码是不一样的,所以要用其他协议,不能直接简单的修改协议,要改动的代码还很多,这里不过多解释。

参考

https://blog.csdn.net/qq_36059561/article/details/103844534

https://blog.csdn.net/qq_36059561/article/details/103848392

https://blog.csdn.net/qq_36059561/article/details/103849242

https://blog.csdn.net/qq_36059561/article/details/103865507

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ActiveMQ 支持传输 JSON 数据。你可以使用 JMS Message 类型为 TextMessage,然后将 JSON 数据作为文本发送。 下面是一个简单的例子: ```java // 创建 ActiveMQ 连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建消息队列 Destination destination = session.createQueue("myQueue"); // 创建消息生产者 MessageProducer producer = session.createProducer(destination); // 创建 JSON 数据 JSONObject jsonObject = new JSONObject(); jsonObject.put("name", "John"); jsonObject.put("age", 30); String json = jsonObject.toString(); // 创建文本消息 TextMessage message = session.createTextMessage(json); // 发送消息 producer.send(message); // 关闭连接 connection.close(); ``` 这个例子将创建一个 ActiveMQ 连接,发送包含 JSON 数据的文本消息到名为 `myQueue` 的消息队列中。 ### 回答2: ActiveMQ是一个开源的消息中间件,它提供了高效可靠的消息传递机制。在ActiveMQ中传输JSON数据是非常常见的场景。 首先,我们需要创建一个ActiveMQ Broker实例,该实例负责接收和分发消息。可以使用ActiveMQ提供的默认配置文件进行配置,并通过命令行启动Broker。 然后,我们需要创建一个消息生产者,这个生产者负责将JSON数据封装成消息并发送到ActiveMQ Broker中。我们可以使用ActiveMQ提供的Java客户端API来实现。首先,我们创建一个连接工厂,然后创建一个连接,接着创建一个会话,并指定要发送的消息队列。最后,我们创建一个消息,并将JSON数据作为消息内容发送。 在接收端,我们需要创建一个消息消费者来接收从ActiveMQ Broker中发送过来的消息。同样地,我们可以使用ActiveMQ提供的Java客户端API来实现。首先,我们创建一个连接工厂,然后创建一个连接,接着创建一个会话,并指定要接收消息的消息队列。最后,我们创建一个消息监听器,并在监听器中处理接收到的JSON数据。 在消息的传输过程中,ActiveMQ会负责将JSON数据进行序列化和反序列化,以确保数据的完整性和可靠性。当消息发送到ActiveMQ Broker时,它会存储在消息队列中,并根据预设的路由策略将消息发送给消息消费者。 总之,ActiveMQ是一个非常强大和灵活的消息中间件,可以很方便地用于传输JSON数据。通过使用ActiveMQ提供的Java客户端API,我们可以轻松地实现消息的发送和接收,并保证数据的完整性和可靠性。 ### 回答3: ActiveMQ是一种流行的开源消息中间件,它支持多种协议和传输格式,包括传输JSON数据。 在ActiveMQ中使用JSON进行消息传输有几种方式。一种常见的方式是将JSON数据封装在消息体中进行传输。发送方将JSON对象转换为字符串,并将其设置为消息的内容,然后通过ActiveMQ发送消息。接收方通过从消息中获取内容并将其解析为JSON对象来接收消息。 另一种方式是使用ActiveMQ的对象消息功能,它允许直接将JSON对象作为消息的内容进行传输。发送方将JSON对象通过ActiveMQ的对象消息接口发送消息,接收方则可以直接接收到JSON对象。 使用JSON进行消息传输具有许多优点。首先,JSON是一种轻量级的数据交换格式,易于理解和解析。其次,JSON格式比较紧凑,可以减少传输数据的大小,提高传输效率。此外,JSON支持多种编程语言,使得跨平台和跨语言的消息传输更加方便和灵活。 总之,ActiveMQ可以轻松地支持JSON数据的传输。借助ActiveMQ的强大功能,开发人员可以方便地将JSON数据封装在消息中进行传输,并能够实现灵活的消息通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值