好记忆不如烂笔头,再简单的知识,都可能被遗忘,所以能记录下点东西,就记录下来、、、
关于ActiveMQ的描述我就不多说了、简单罗列下他的三种方式,如下:
1.ActiviteMQ消息有3中形式
JMS 公共 | 点对点域 | 发布/订阅域 |
ConnectionFactory | QueueConnectionFactory | TopicConnectionFactory |
Connection | QueueConnection | TopicConnection |
Destination | Queue | Topic |
Session | QueueSession | TopicSession |
MessageProducer | QueueSender | TopicPublisher |
MessageConsumer | QueueReceiver | TopicSubscriber |
2.JMS 公共实现
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.ActiveMQConnectionFactory;
public class JMSSender {
public staticvoid main(String[] args) throws Exception {
run();
}
// 发送次数
public static final intSEND_NUM = 10;
// tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
public static final String DESTINATION ="jms";
public staticvoid run() throws Exception {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection =null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// MessageProducer:消息发送者
MessageProducer producer;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory =new ActiveMQConnectionFactory("admin","admin",BROKER_URL);
try {
// 构造从工厂得到连接对象
connection =connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接 : true 表示是transaction,false : 表示不是;
//AUTO_ACKNOWLEDGE:自动接收消息;
//CLIENT_ACKNOWLEDGE 客户端程序将确认收到的一则消息,调用这则消息的确认方法;
//DUPS_OK_ACKNOWLEDGE 这个选项命令session“懒散的”确认消息传递,可以想到,这将导致消息提供者传递的一些复制消息可能出错;
session =connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination =session.createQueue(DESTINATION);
// 得到消息生成者【发送者】
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 (Throwableignore) {
}
}
}
public staticvoid sendMessage(Session session, MessageProducerproducer) throws Exception {
for (inti = 1; i <= SEND_NUM;i++) {
TextMessage message = session.createTextMessage("jms ActiveMq 发送的消息" +i);
// 发送消息到目的地方
System.out.println("发送消息:" +"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.ActiveMQConnectionFactory;
public class JMSReceiver {
public staticvoid main(String[] args) throws Exception {
run();
}
// 发送次数
public static final intSEND_NUM = 10;
// tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
public static final String DESTINATION ="jms";
public staticvoid run() throws Exception {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection =null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// 消费者,消息接收者
MessageConsumer consumer;
connectionFactory =new ActiveMQConnectionFactory("admin","admin",BROKER_URL);
try {
// 构造从工厂得到连接对象
connection =connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session =connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination =session.createQueue(DESTINATION);
consumer =session.createConsumer(destination);
while (true) {
// 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
TextMessage message = (TextMessage) consumer.receive(10000);
if (null !=message) {
System.out.println("收到消息=>" +message.getText());
}
else {
break;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (null !=connection) connection.close();
}
catch (Throwableignore) {
}
}
}
}
3.点对点域
import javax.jms.DeliveryMode;
import javax.jms.MapMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PointSender {
publicstatic void main(String[] args) throws Exception {
PointSender.run();
}
// 发送次数
publicstatic final intSEND_NUM = 10;
//tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
publicstatic final String DESTINATION ="point";
publicstatic void sendMessage(QueueSessionsession, javax.jms.QueueSender sender)throws Exception {
for (inti = 0; i < SEND_NUM;i++) {
Stringmessage = "发送消息第" + (i + 1) +"条";
MapMessagemap = session.createMapMessage();
map.setString("text",message);
map.setLong("time", System.currentTimeMillis());
System.out.println(map);
sender.send(map);
}
}
publicstatic void run() throws Exception {
QueueConnectionconnection = null;
QueueSession session = null;
try {
// 创建链接工厂
QueueConnectionFactoryfactory = new ActiveMQConnectionFactory("admin","admin",BROKER_URL);
// 通过工厂创建一个连接
connection =factory.createQueueConnection();
// 启动连接
connection.start();
// 创建一个session会话
session =connection.createQueueSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建一个消息队列
Queuequeue = session.createQueue(DESTINATION);
// 创建消息发送者
javax.jms.QueueSendersender = session.createSender(queue);
// 设置持久化模式
sender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
sendMessage(session,sender);
// 提交会话
session.commit();
}
catch (Exceptione) {
throwe;
}
finally {
// 关闭释放资源
if (session !=null) {
session.close();
}
if (connection !=null) {
connection.close();
}
}
}
}
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
public class PointReceiver {
public static void main(String[] args) throws Exception {
PointReceiver.run();
}
// tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
public static final String TARGET = "point";
public static void run() throws Exception {
QueueConnection connection = null;
QueueSession session = null;
try {
// 创建链接工厂
QueueConnectionFactory factory =new ActiveMQConnectionFactory("admin","admin", BROKER_URL);
// 通过工厂创建一个连接
connection = factory.createQueueConnection();
// 启动连接
connection.start();
// 创建一个session会话
session = connection.createQueueSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建一个消息队列
Queue queue = session.createQueue(TARGET);
// 创建消息制作者
QueueReceiver receiver = session.createReceiver(queue);
while (true) {
// 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
TextMessage message = (TextMessage) receiver.receive(10000);
if (null !=message) {
System.out.println("收到消息=>" +message.getText());
}
else {
break;
}
}
// 休眠100ms再关闭
Thread.sleep(1000 * 100);
// 提交会话
session.commit();
} catch (Exception e) {
throw e;
} finally {
// 关闭释放资源
if (session !=null) {
session.close();
}
if (connection !=null) {
connection.close();
}
}
}
}
4.订阅/发布
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnectionFactory;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicSender {
public staticvoid main(String[] args) throws Exception {
run();
}
// 发送次数
public static final intSEND_NUM = 5;
// tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
public static final String DESTINATION ="topic";
/**
* <b>function:</b> 发送消息
*/
public staticvoid sendMessage(Session session, MessageProducerproducer) throws Exception {
for (inti = 0; i < SEND_NUM;i++) {
String message ="topic 发送消息第" + (i + 1) + "条";
TextMessage map = session.createTextMessage(message);
System.out.println(map);
producer.send(map);
}
}
public staticvoid run() throws Exception {
Connection connection =null;
Session session =null;
try {
// 创建链接工厂
TopicConnectionFactory factory = new ActiveMQConnectionFactory("admin","admin",BROKER_URL);
// 通过工厂创建一个连接
connection =factory.createTopicConnection();
// 启动连接
connection.start();
// 创建一个session会话
session =connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建一个消息队列
Topic topic =session.createTopic(DESTINATION);
// 创建消息发送者
MessageProducer producer = session.createProducer(topic);
// 设置持久化模式
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//发送.
sendMessage(session,producer);
// 提交会话
session.commit();
}
catch (Exception e) {
throwe;
}
finally {
// 关闭释放资源
if (session !=null) {
session.close();
}
if (connection !=null) {
connection.close();
}
}
}
}
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;
public class TopicReceiver {
public staticvoid main(String[] args) throws Exception {
run(); // success
}
// tcp 地址
publicstatic final StringBROKER_URL = "tcp://localhost:61616";
// 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp
public static final String TARGET ="topic";
public staticvoid run() throws Exception {
Connection connection =null;
Session session =null;
try {
// 创建链接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("admin","admin", BROKER_URL);
// 通过工厂创建一个连接
connection =factory.createConnection();
connection.setClientID(TARGET);
// 启动连接
connection.start();
// 创建一个session会话
session =connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建一个消息队列
ActiveMQTopic topic = new ActiveMQTopic(TARGET);
// 创建消息制作者
MessageConsumer consumer = session.createDurableSubscriber(topic,TARGET);
System.out.println("发布完的消息是:");
while (true) {
// 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
TextMessage message = (TextMessage) consumer.receive(5000);
if (null !=message ) {
System.out.println("topic 收到消息=>:time=" +message.getText());
}
else {
break;
}
}
// 提交会话
session.commit();
}
catch (Exception e) {
throwe;
}
finally {
// 关闭释放资源
if (session !=null) {
session.close();
}
if (connection !=null) {
connection.close();
}
}
}
}
ActiveMQ 的三种实现就是这样的了,主要的封装和实现在API中都有体现,我就不再叙述。
5.发送消息的基本步骤
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender
(5)、使用消息生产者MessageSender发送消息
6.消息接收者从JMS接受消息的步骤
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息接收者MessageReceiver
(5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。
暂且到这,后边再续、