一.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&wireFormat.maxFrameSize=104857600&org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&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();
}
}