activeMQ的使用

一、启动、查看状态和停止

启动
[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框架图解

JMS的API

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);

主题模式

订阅者设置为可持久化方式,首先先运行一次订阅者,就是向发布者注册;然后在运行生产者;此时无论订阅者是否在线都可以接收到消息,离线的订阅者在下次在线时依然会接收到该消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值