1、ActiveMq 编码实现
新建一个maven项目对应的pom.xml文件的部分内容如下,jdk 是1.8 其他的配置都是自动生成的。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
</dependencies>
2、生产者
public class JmsProduce {
public static final String ACTIVEMQ_URL = "tcp://10.5.96.48:61616";
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);
//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完毕 ****");
}
}
执行main方法 ,如图
前端页面
Number of Pending Message 等待消费的消息 这个当前未出队的数量。公式=总接收数-总出队数
Number of Consumer 消费者数据量 消费者端的消费者数量
Messages Enqueued 进队消息数 进入队列的总数量,包括出队列的,这个数量只增不减
Messages Dequeued 出队消息数 意义理解为是消费者消费掉的数量
代码执行成功 发送了3条消息 到mq 队列 queue01中
3 消费者 receive() 这是方式一
public class JmsConsumer {
public static final String ACTIVEMQ_URL = "tcp://10.5.96.48:61616";
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);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(queue);
while(true){
TextMessage textMessage = (TextMessage) messageConsumer.receive();
if( null !=textMessage ){
System.out.println("***消费者受到消息:" + textMessage.getText());
}else{
break;
}
}
messageConsumer.close();
session.close();
connection.close();
}
注意后台 红色的运行的灯一直是红色的亮着,表示程序一直在运行,这就是receive()方法一直在等待消息,即使已经消分完3条消息了,依然终止等待。
前端 显示有一个 消费者 消费了3条消息
当点击“红色”的 运行结束的按钮
程序运行结束,在看看前台的变化,红框中的1 个消费者变成了0,程序结束了,消费者也没有了
当将receive()方法传入参数4000 时,表示4秒内收不到消息,消费者就走人了,程序运行结束了
小总结
/**
* 方式一
* 同步阻塞方式receive()
* 订阅者或接受者调用MessageConsumer的receive()方法来接收消息,receive方法在能接收
* 到消息之前(或超时之前)将一直阻塞
**/
4 receive 方式二
//添加监听器
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("****消费者接收到消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
System.in.read(); //保证控制台一直运行,有消息就消费,没有消息,一直监听
messageConsumer.close();
session.close();
connection.close();
总结
/** 方式二
* 通过监听器的方式来消费消息 MessageConsumer messageConsumer = session.createConsumer();
* 异步非阻塞方式(监听器onMessage())
* 订阅者或者接受者 通过MessageConsumer的setMessageListener(MessageListener listener)注册一个消息监听器
* 当消息到达后,系统自动调用监听器MessageListener的onMessage(Message Message)方法
*/