ActiveMQ
今天偶然回忆了过去用过的activeMQ 这个中间件,好些东西都不记得了.
1.什么是activeMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持通过JDBC和journal提供高速的消息持久化
7. 从设计上保证了高性能的集群,客户端-服务器,点对点
8. 支持Ajax
9. 支持与Axis的整合
10. 可以很容易得调用内嵌JMS provider,进行测试
2.什么是JMS
JMS的全称是Java Message Service,即Java消息服务。用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。
对于消息的传递有两种类型:
一种是点对点的,即一个生产者和一个消费者一一对应;
另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
· StreamMessage -- Java原始值的数据流
· MapMessage--一套名称-值对
· TextMessage--一个字符串对象
· ObjectMessage--一个序列化的 Java对象
· BytesMessage--一个字节的数据流
3.如何安装ActiveMq到Ubuntu中
1.下载安装包解压即可 进入解压目录的bin中 apache-activemq-5.15.4/bin
如何下载文件搞到服务器上,自行百度
2.运行 ./activemq start 即可 注意 必须安装jdk 5.15.4 要jdk8.....
3.开放8161端口给ActiveMQ控制台 开放61616端口给通信端口
ubuntu如何开放端口:sudo
ufw allow 80 开放80
sudo
ufw reload 刷新防火墙
4.使用java语言操作activeMQ
P2P
public class QueueSender {
public static void main(String[] args) {
//创建一个连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
try {
//从工厂对象中获得连接
Connection connection = connectionFactory.createConnection();
//开启连接
connection.start();
/*
connection.createSession(paramA, paramB)
A)paramA设置为true时: 注意开启事务一定要commit 否则会被回滚
paramB的值忽略, acknowledgment mode被jms服务器设置 SESSION_TRANSACTED 。
当一个事务被提交的时候,消息确认就会自动发生。
B) paramA设置为false时:
Session.AUTO_ACKNOWLEDGE为自动确认,当客户成功的从receive方法返回的时候,或者从
MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。
Session.CLIENT_ACKNOWLEDGE 为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的
acknowledge方法。jms服务器才会删除消息。(默认是批量确认)
*/
//开启一个回话,第一个参数指定不使用事务,第二个参数指定客户端接收消息的确认方式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一目的地Queue或者是Topic
Queue queue = session.createQueue("mytestqueue");
//创建一个生产者
MessageProducer producer = session.createProducer(queue);
//创建message
TextMessage message = new ActiveMQTextMessage();
message.setText("hello");
//发送消息
producer.send(message);
//关闭
producer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }}
同步消费者
public class QueueConsumer {
public static void main(String[] args) {
//创建一连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
try {
//创建一个连接
Connection connection = connectionFactory.createConnection();
//打开连接
connection.start();
//创建一个回话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个目的地Destination
Queue queue = session.createQueue("mytestqueue");
//创建一个消费者
MessageConsumer consumer = session.createConsumer(queue);
while(true) {
//设置接收者接收消息的时间,为了便于测试,这里定为100s
Message message = consumer.receive(100000);
if (message != null) {
System.out.println(message);
} else {
//超时结束
break;
}
}
consumer.close();
session.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
异步消费者
public class QueueConsumer {
public static void main(String[] args) {
//创建一连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
try {
//创建一个连接
Connection connection = connectionFactory.createConnection();
//打开连接
connection.start();
//创建一个回话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个目的地Destination
Queue queue = session.createQueue("mytestqueue");
//创建一个消费者
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
String text = "";
try {
text = ((TextMessage)message).getText();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(text);
}
}
});
System.in.read();
//关闭
consumer.close();
session.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.4发布者/订阅者 消息消费者要在线
3.4.1Producer
public class TopicProducer {
public static void main(String[] args) {
//创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
try {
//创建连接
Connection connection = connectionFactory.createConnection();
//开启连接
connection.start();
//创建一个回话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个Destination,queue或者Topic
Topic topic = session.createTopic("mytopic");
//创建一个生成者
MessageProducer producer = session.createProducer(topic);
//创建一个消息
TextMessage textMessage = new ActiveMQTextMessage();
textMessage.setText("hello my topic");
//发送消息
producer.send(textMessage);
//关闭
producer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.4.2Consumer
public class TopicConsumer {
public static void main(String[] args) {
//创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");
try {
//创建连接
Connection connection = connectionFactory.createConnection();
connection.start();
//创建一个会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个目标
Destination destination = session.createTopic("mytopic");
//创建一个消费者
MessageConsumer consumer = session.createConsumer(destination);
//接收消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
System.out.println(message);
}
});
//暂停
System.in.read();
//关闭
consumer.close();
session.close();
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}