ActivityMQ
-
JMS
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
-
JMS的优势
异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。
可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复
-
JSM的两种交互方式
点对点消息模型
(1)、每个消息只有一个接受者(自己测试了一下,可以有多个接受者,但是当有多个接收者时,每个接收者只能获取随机的几条信息)
(2)、消息发送者和消息接受者并没有时间依赖性。
(3)、当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;
(4)、当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。
(5)点对点消息模型图:
发布/订阅消息模型
(1)、一个消息可以传递给多个订阅者
(2)、发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
(3)、为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
(4)、发布/订阅消息模型图:
-
ActiveMQ的下载
-
ActiveMQ的点对点使用
Session.AUTO_ACKNOWLEDGE。当客户成功的从receive 方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。
Session.CLIENT_ACKNOWLEDGE。 客户通过消息的 acknowledge 方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确认。
Session.DUPS_ACKNOWLEDGE。 该选择只是会话迟钝的确认消息的提交。如果 JMS provider 失败,那么可能会导致一些重复的消息。如果是重复的消息,那么 JMS provider 必须把消息头的 JMSRedelivered 字段设置为 true。
-
maven需要依赖的包
<!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.12.1</version>
</dependency>
-
消息生产者
public class Producer {
private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
public static void main(String[] args) {
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接
Session session = null;//会话
Destination destination = null;//消息目的地,就是一个消息队列
MessageProducer messageProducer = null;//消息生产者
try {
//1.连接MQ
System.out.println("username:"+USERNAME);
System.out.println("password:"+PASSWORD);
System.out.println("url:"+BROKEURL);
connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("ActiveMQTopic");
messageProducer = session.createProducer(destination);
Destination destination2 = session.createQueue("spring-activemq");
MessageProducer messageProducer2 = session.createProducer(destination2);
//2.发送消息
for (int i=0;i<10;i++){
String txt = "电话:1380000111"+i;
TextMessage txtMsg = session.createTextMessage(txt);
messageProducer.send(destination,txtMsg);
System.out.println("发送到MQ:topic" + i);
TextMessage txtMsg2 = session.createTextMessage(txt);
messageProducer2.send(destination2,txtMsg2);
System.out.println("发送到MQ:queue:" + i);
}
session.commit();
}catch (Exception e){
e.printStackTrace();
}
}
}
-
消息消费者
public class Consumer {
private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
public static void main(String[] args) {
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接
Session session = null;//会话
Destination destination = null;//消息目的地,就是一个消息队列
MessageConsumer messageConsumer = null;//消息生产者
try {
//1.连接MQ
System.out.println("username:"+USERNAME);
System.out.println("password:"+PASSWORD);
System.out.println("url:"+BROKEURL);
connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("短信发送");
messageConsumer = session.createConsumer(destination);
//2.从MQ服务器取消息
/*for (int i=0;i<5;i++){
TextMessage textMessage = (TextMessage) messageConsumer.receive();
System.out.println(textMessage.getText());
}*/
//3.写MQ的监听器
System.out.println("aaaaaaaaaaaaaaa");
messageConsumer.setMessageListener(new MyMessageListener());
System.out.println("bbbbbbbbbbb");
session.commit();
System.out.println("ccccccccccc");
}catch (Exception e){
e.printStackTrace();
}finally {
/*System.out.println("关闭");
//3.断开
try{
messageConsumer.close();
session.close();
connection.close();
}catch (Exception e){
}*/
}
}
}
-
在管理中心
在浏览器中输入:http://127.0.0.1:8161/admin/
-
相关的连接
activitymq使用:https://blog.csdn.net/yinbucheng/article/details/71189324