JAVA 消息队列ActiveMQ

好记忆不如烂笔头,再简单的知识,都可能被遗忘,所以能记录下点东西,就记录下来、、、

关于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事件方法。



暂且到这,后边再续、



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值