1. 实现点对点通讯模式
使用ActiveMQ完成点对点(p2p)通讯模式
<!-- ActiveMQ 技术 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
生产者
public class Producer {
/** mq通讯地址 */
private final static String URL = "tcp://localhost:61616";
/** 队列名称 */
private final static String QUEUENAME = "my_queue";
public static void main(String[] args) throws JMSException {
/** 创建ActiveMQFactory */
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
/** 创建连接 */
Connection cnnection = factory.createConnection();
/** 启动连接 */
cnnection.start();
/** 创建session 不开启事务,自动签收模式 */
Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/** 创建一个目标 */
Queue queue = session.createQueue(QUEUENAME);
/** 创建生产者 */
MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < 10; i++) {
/** 创建消息 */
TextMessage textMessage = session.createTextMessage("消息" + i);
/** 发送消息 */
producer.send(textMessage);
System.out.println(textMessage.toString());
}
/** 关闭连接 */
cnnection.close();
}
}
消费者
public class Consumer {
/** mq通讯地址 */
private final static String URL = "tcp://localhost:61616";
/** 队列名称 */
private final static String QUEUENAME = "my_queue";
public static void main(String[] args) throws JMSException {
/** 创建ActiveMQFactory */
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
/** 创建连接 */
Connection connection = factory.createConnection();
/** 启动连接 */
connection.start();
/** 创建Session 不开启事务,自动签收模式 */
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/** 创建一个目标 */
Queue queue = session.createQueue(QUEUENAME);
/** 创建生产者 */
MessageConsumer createConsumer = session.createConsumer(queue);
createConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println("消费者消费消息:" + textMessage.getText());
} catch (Exception e) {
// TODO: handle exception
}
}
});
// 连接先不要关闭
}
}
2. JMS消息可靠机制
ActiveMQ消息签收机制:
客户端成功接收一条消息的标志是一条消息被签收,成功答应。
消息的签收情形分两种:
- 带事务的session
如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。 - 不带事务的session
不带事务的session的签收方式,取决于session的配置。
ActiveMQ支持一下三种模式:
- Session.AUTO_ACKNOWLEDGE 消息自动签收
- Session.CLIENT_ACKNOWLEDGE 客戶端调用acknowledge方法手动签收 textMessage.acknowledge();//手动签收
- Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息只有被确定之后,才认为已经被成功地消费了,消息的成功消费通常包含三个阶段:客户接受消息、客户处理消息和消息被确认。在事务性会话中,当一个事物被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。改参数有三个可选值:
Number Of Consumers 消费者 这个是消费者端的消费者数量
Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数
Messages Enqueued 进入队列的消息 进入队列的总数量,包括出队列的。 这个数量只增不减
Messages Dequeued 出了队列的消息 可以理解为是消费这消费掉的数量
3. 发布订阅
生产者:
public class Producter2 {
/**
* mq通讯地址
*/
private final static String URL = "tcp://localhost:61616";
/**
* 主题名称
*/
private final static String TOPICNAME = "my_topic";
public static void main(String[] args) throws JMSException {
// 1.创建ActiveMQFactory
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
// 2.创建连接
Connection cnnection = factory.createConnection();
// 3.启动连接
cnnection.start();
// 4.创建Session 不开启事务,自动签收模式
Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建一个目标
Topic createTopic = session.createTopic(TOPICNAME);
// 6.创建生产者
MessageProducer producer = session.createProducer(createTopic);
// 设置消息持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 1; i <= 10; i++) {
// 7.创建消息
TextMessage textMessage = session.createTextMessage("消息" + i);
// 8.发送消息
producer.send(textMessage);
System.out.println(textMessage.toString());
}
// 9.关闭连接
cnnection.close();
}
}
消费者:
public class Consumer2 {
/**
* mq通讯地址
*/
private final static String URL = "tcp://localhost:61616";
/**
* 主题名称
*/
private final static String TOPICNAME = "my_topic";
public static void main(String[] args) throws JMSException {
// 1.创建ActiveMQFactory
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
// 2.创建连接
Connection cnnection = factory.createConnection();
// 3.启动连接
cnnection.start();
// 4.创建Session 不开启事务,自动签收模式
Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建一个目标
Topic topic = session.createTopic(TOPICNAME);
// 6.创建生产者
MessageConsumer createConsumer = session.createConsumer(topic);
createConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println("消费者消费消息:" + textMessage.getText());
} catch (Exception e) {
// TODO: handle exception
}
}
});
// 先不要关闭连接
}
}