关于web系统中队列的使用参看文章http://jinnianshilongnian.iteye.com/blog/2321715
前言:
消息队列仅仅是队列中的一个分支应用,使用场景:各个微服务之间的通信,包括数据异步同步等等场合,比如下订单业务,可能涉及到用户中心服务,订单服务,财务服务,产品服务,仓库服务等微服务;传统做法是写大量的接口,各个服务间调用接口来进行创建订单、付款、支付、扣减库存等等操作,一方面大量接口后期难以维护,可能改一个接口会导致整个订单流程挂掉;另一方面接口之间会出现调用失败、相应超时等问题。在这种情况下,引入消息队列,可以解决这些问题。通过消息队列可实现异步处理、系统解耦。
1.下载ActiveMQ
http://activemq.apache.org/
通过url可以看出来,apache出品~
2.安装使用
解压下载的zip文件,执行bin目录的activemq.bat。启动后,登陆:http://localhost:8161/admin/,用户名和密码都是admin
3.实例
程序需要的jar包如下:
activemq-client-5.9.0.jar
geronimo-j2ee-management_1.1_spec-1.0.1.jar
geronimo-jms_1.1_spec-1.1.1.jar
log4j-1.2.17.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
我这里模拟生产者/消费者,或者可以叫生产者/接受者。
先写发送模块
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 测试activeMQ消息
*
* @author ***
* */
public class Sender {
private static final int SEND_NUMBER = 5;
public void sendMessage() {
// 连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// JMS 客户端到JMS Provider 的连接
Connection connection = null;
// 一个发送或接收消息的线程
Session session;
// 消息的目的地
Destination destination;
// 消息发送者
MessageProducer producer;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
// 获取session,注意参数值,接收要同样的Queue
destination = session.createQueue("FirstQueue");
// 得到消息生成者
producer = session.createProducer(destination);
// 设置不持久化,此处学习,实际根据项目决定
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 构造消息,此处写死,项目就是参数,或者方法获取
sendMessage(session, producer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
private void sendMessage(Session session, MessageProducer producer)
throws Exception {
for (int i = 1; i <= SEND_NUMBER; i++) {
TextMessage message = session.createTextMessage("ActiveMq 发送的消息"
+ i);
producer.send(message);
}
}
}
接收模块
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) {
// 连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// JMS 客户端到JMS Provider 的连接
Connection connection = null;
// 一个发送或接收消息的线程
Session session;
// 消息的目的地
Destination destination;
// 消息接收者
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
// 获取session
destination = session.createQueue("FirstQueue");
consumer = session.createConsumer(destination);
while (true) {
// 设置接收者接收消息的时间
// 0意思是程序会一直运行
TextMessage message = (TextMessage) consumer.receive(0);
if (null != message) {
System.out.println("收到消息" + message.getText());
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}
测试的时候,可以在Sender.java中增加一个main方法,先调用sendMessage(),然后启动Receiver.java,可以在控制台看到打印出了接受的值。
也可以登录http://localhost:8161/admin/查看发送接收的消息。
我自己觉得activemq就是一个转发服务器,具体技术细节待后续研究。