目录
- activemq总结
- 消息组成
- 1.消息头
- 2.消息体
- 3.消息属性
- 消息可靠性
- 1.持久化
- 2.事务
- 3.签收
- 根据配置文件启动 activeMQ
- Java硬编码启动自己mq
activemq总结
消息组成
1.消息头
在发送消息时可以设置消息头的属性
常用方法:
JMSDestination:发送消息的目的地主要指queue和topic
JMSDeliveryMode:持久和非持久
JMSExpiration:过期时间(0表示永不过期)
JMSPriority:优先级(0-4普通消息,5-9加急消息,默认4)
JMSMessageID:唯一识别(mq有自己生成的)send方法也提供了 一些设置
2.消息体
五种格
3.消息属性
对消息头和消息体的加强。可以对数据进行识别、去重、标识。
mq提供了设置各种属性值的方法。
消息可靠性
1.持久化
MQ默认是持久化
topic持久化
生产者
public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
public static final String TOPIC_NAME="topic_pristst";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
//第一个参数事务,第二个参数签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建主题,设置主题的名称
Topic topic = session.createTopic(TOPIC_NAME);
//创建生产者
MessageProducer producer = session.createProducer(topic);
//持久化设置
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start();
//向mq发送三条消息
for(int i=0;i<3;i++){
TextMessage textMessage = session.createTextMessage("msg------"+i);
producer.send(textMessage);
}
producer.close();
session.close();
connection.close();
System.out.println("------------------------------消息发送完成");
}
消费者
public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
public static final String TOPIC_NAME="topic_pristst";
public static void main(String[] args) throws JMSException, IOException {
System.out.println("我是1号消费者");
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
connection.setClientID("1号");
//第一个参数事务,第二个参数签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建主题,设置主题的名称
Topic topic = session.createTopic(TOPIC_NAME);
TopicSubscriber durableSubscriber = session.createDurableSubscriber(topic, "remark------------------------");
connection.start();
Message receive = durableSubscriber.receive();
while (null!=receive){
TextMessage textMessage = (TextMessage) receive;
System.out.println("监听持久化消息。。。。。。。。。。"+textMessage.getText());
receive=durableSubscriber.receive();
}
session.close();
connection.close();
}
注意:必须先启动消费者,只有消费者先注册后,当消费者宕机后重新连接才可以接受到所有消息。否则只能接收到订阅后的数据。
2.事务
事务偏生产者
//第一个参数事务,第二个参数签收
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
开启事务后必须提交,否则mq接受不到消息
//关闭资源
producer.close();
session.commit(); //事务提交
session.close();
connection.close();
生产者开启事务
public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
public static final String TOPIC_NAME="topic_pristst";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
//第一个参数事务,第二个参数签收
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建主题,设置主题的名称
Topic topic = session.createTopic(TOPIC_NAME);
//创建生产者
MessageProducer producer = session.createProducer(topic);
//持久化设置
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start();
try {
//向mq发送三条消息
for(int i=0;i<10000;i++){
TextMessage textMessage = session.createTextMessage("msg------"+i);
producer.send(textMessage);
}
//关闭资源
producer.close();
session.commit();
session.close();
connection.close();
System.out.println("------------------------------消息发送完成");
} catch (Exception e){
e.printStackTrace();
session.rollback();
}finally {
}
}
消费者开启事务
注意:消费者开启事务后如果事务没有提交,当消费者重新连接mq后消息会重复消费。
总结
开启事务的优点:当生产者数据发送到一半时出现异常可以进行回滚
3.签收
签收偏消费者
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
四种签收类型:
AUTO_ACKNOWLEDGE:自动签收
CLIENT_ACKNOWLEDGE:手动签收
DUPS_OK_ACKNOWLEDGE:允许部分重复签收
SESSION_TRANSACTED:事务级
总结:
1.消费者开起手动签收,如果没有确认签收,消费者下次连接会重复消费。
2.开启事务后签收将自动签收,即使签收成功,如果事务没有提交还是会重复消费
根据配置文件启动 activeMQ
在bin目录下执行性下面命令
./activemq start xbeen:file:文件地址(例如 ./activemq start xbean:file:…/conf/activemq.xml)
Java硬编码启动自己mq
public static void main(String[] args) throws Exception {
BrokerService brokerService = new BrokerService();
brokerService.setUseJmx(true);
brokerService.addConnector("tcp://localhost:61616");
brokerService.start();
}