什么是ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和JavaEE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:
- 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
- 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
- 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
ActiveMQ的消息形式
对于消息的传递有两种类型:
- 一种是点对点的,即一个生产者和一个消费者一一对应;
- 另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性:
- StreamMessage – Java原始值的数据流
- MapMessage–一套名称-值对
- TextMessage–一个字符串对象
- ObjectMessage–一个序列化的 Java对象
- BytesMessage–一个字节的数据流
Demo:ActiveMQ在Linux启动,window访问
在WMware总,opt文件夹下的ActiveMQ文件夹中启动. ./activemq start
一定要关闭Linux中的防火墙,否则window中访问不到,Centos7中关闭防火墙:systemctl stop firewalld.service
点对点模式
java
//创建生产者 点对点模式
@Test
public void test1() throws JMSException {
//需要先连接到ActiveMQ
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
//从工厂获取链接
Connection conn = factory.createConnection();
//链接
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建发送到的目的地
Queue queue = session.createQueue("myqueue");
//创建生产者
MessageProducer producer = session.createProducer(queue);
//发送的内容
TextMessage message = session.createTextMessage("one ActiveMQ");
//发送
producer.send(message);
producer.close();
session.close();
conn.close();
}
//创建消费者,点对点
@Test
public void test2() throws JMSException, IOException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
Connection conn = factory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建接受目的地
Queue uqeue = session.createQueue("myqueue");
//创建消费者
MessageConsumer consumer = session.createConsumer(uqeue);
//监听消息是否过来
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
try{
TextMessage message =(TextMessage) arg0;
String text = message.getText();
System.out.println(text);
}catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
});
//阻塞方法
System.in.read();
consumer.close();
session.close();
conn.close();
}
先启动生产者代码,登录ActiveMQ的后台,Linux的ip地址:8161/admin.我的是http://10.0.117.198:8161/admin.输入初始账号密码admin登录,点击Queues中可以看到生产者发送的消息,此时运行消费者会受到消息.
订阅模式
java
//发布订阅方式发送消息
@Test
public void test3() throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
Connection conn = factory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//目的地
Topic topic = session.createTopic("mytopic");
//生产者
MessageProducer producer = session.createProducer(topic);
//发送的内容
TextMessage text = session.createTextMessage("hello topic");
producer.send(text);
producer.close();
session.close();
conn.close();
}
@Test
public void test4() throws JMSException, IOException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.117.198:61616");
Connection conn = factory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("mytopic");
MessageConsumer consumer = session.createConsumer(topic);
//匿名内部类
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
try {
TextMessage text =(TextMessage) arg0;
String text2 = text.getText();
System.out.println(text2);
}catch (Exception e) {
// TODO: handle exception
}
}
});
System.in.read();
consumer.close();
session.close();
conn.close();
}
运行时应先启动接收方(消费者),再启动生产者,否者消费者接受不到信息.