一、启动、查看状态和停止
启动
[root@localhost bin]# ./activemq start
INFO: Loading '/opt/apache-activemq-5.15.9//bin/env'
INFO: Using java '/usr/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/opt/apache-activemq-5.15.9//data/activemq.pid' (pid '10076')
查看状态
[root@localhost bin]# ./activemq status
INFO: Loading '/opt/apache-activemq-5.15.9//bin/env'
INFO: Using java '/usr/bin/java'
ActiveMQ is running (pid '10076')
停止
[root@localhost bin]# ./activemq stop
INFO: Loading '/opt/apache-activemq-5.15.9//bin/env'
INFO: Using java '/usr/bin/java'
INFO: Waiting at least 30 seconds for regular process termination of pid '10076' :
Connecting to pid: 10076
INFO: failed to resolve jmxUrl for pid:10076, using default JMX url
Connecting to JMX URL: service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
.INFO: Broker not available at: service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
..............................
INFO: Regular shutdown not successful, sending SIGKILL to process
INFO: sending SIGKILL to pid '10076'
1.1activeMQ的默认8161和61616端口
8161是后台管理系统(url中访问后台管理页用此端口),61616是给java用的tcp端口。
1.2后台登陆默认用户名为admin,默认密码为admin
二、java对activeMQ的使用
2.1 JMS框架图解
activeMQ总共有两种模式:生产者消费者的队列和发布订阅的主题。
2.2 java对两种模式的使用
2.2.1队列模式中
(1)生产者发送消息
public class MessageProducer {
private static final String ACTIVEMQ_URL="tcp://127.0.0.1:61616";
private static final String QUEUE_NAME="MyQueue";
public static void main(String[] args) throws JMSException {
//创建connectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//创建Connection
Connection connection = connectionFactory.createConnection();
//开启Connection
connection.start();
//创建Session
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建Destination
Destination destination=session.createQueue(QUEUE_NAME);
//根据Destination创建MessageProducer
javax.jms.MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 4; i++) {
//Session创建TextMessage
TextMessage textMessage = session.createTextMessage("this message"+i);
//MessageProducer发送消息
producer.send(textMessage);
System.out.println("this message"+i);
}
//关闭资源
producer.close();
session.close();
connection.close();
}
}
(2)消费者使用消息
public class MessageConsumer {
private static final String ACTIVEMQ_URL="tcp://127.0.0.1:61616";
private static final String QUEUE_NAME="MyQueue";
public static void main(String[] args) throws JMSException {
//创建connectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//创建connection
Connection connection = connectionFactory.createConnection();
//开启connection
connection.start();
//创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建Destination
Destination destination = session.createQueue(QUEUE_NAME);
//创建consumer
javax.jms.MessageConsumer consumer = session.createConsumer(destination);
//创建consumer监听器:当生产者产生消息时就会消耗消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage) message;
try {
System.out.println("consumer:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
consumer.close();
session.close();
connection.close();
}
}
通过后端控制台可以观察当生产者产生四条消息时,消费者未使用是,队列中四条消息
2.2.2发布者和订阅者
(1)订阅者
public class MessageTopicConsumer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
private static final String TOPIC_NAME = "MyTopicMessage";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic(TOPIC_NAME);
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
consumer.close();
session.close();
connection.close();
}
}
(2)发布者
public class MessageTopicProducer {
private static final String ACTIVEMQ_URL="tcp://127.0.0.1:61616";
private static final String TOPIC_NAME="MyTopicMessage";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination=session.createTopic(TOPIC_NAME);
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 50; i++) {
TextMessage textMessage = session.createTextMessage("topic message"+i);
producer.send(textMessage);
System.out.println(textMessage.getText());
}
producer.close();
session.close();
connection.close();
}
}
注意!当Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);时第一个参数是事务,第二个参数是签收。事务偏向于队列中的生产者,签收适用于消费者。如果事务默认为true,则要在发送消息之后手动commit()。
持久化:
为了解决意外宕机时保证数据的可靠性的一种技术
队列的默认持久化方式是开启的。显式设置为
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
主题模式
订阅者设置为可持久化方式,首先先运行一次订阅者,就是向发布者注册;然后在运行生产者;此时无论订阅者是否在线都可以接收到消息,离线的订阅者在下次在线时依然会接收到该消息。