ActiveMQ

1.什么是ActiveMQ?

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。

当我们想要低耦合,也不希望工程的启动有先后顺序之分,此时的最佳选择就是采用消息队列来实现。

2.ActiveMQ有两种消息方式。分别为queue以及topic。

queue是点对点式。即一个生产者和一个消费者一一对应

topic是订阅/发布式。即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

3.如何使用ActiveMQ

使用ActiveMQ,分为服务端以及客户端。要先启动服务端后,才能实现客户端。

服务端的启动,则需要在服务端安装ActiveMQ。(可参见笔者之前的写在Linux下安装ActiveMQ

ActiveMQ的客户端支持多种语言,比如java,c,c++,等等,笔者这里以java为例来演示ActiveMQ的使用。

第一种:queue(点对点)

01ActiveMQ_queue_producer

@Test
	public void TestQueueProducer() throws Exception {
		// 创建工厂,指定连接url,固定端口号61616以及tcp协议
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();

		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		Queue queue = session.createQueue("test-queue");
		MessageProducer producer = session.createProducer(queue);

		TextMessage string = session.createTextMessage("hello activemq");

		producer.send(string);

		producer.close();
		session.close();
		connection.close();
	}

把消息发布到服务端,服务端持久化保存起来,直到有消费者把该消息取出,服务端就把该消息清楚掉。

02ActiveMQ_queue_concustomer

@Test
	public void testQueueCustomer() throws Exception {

		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

		Queue queue = session.createQueue("test-queue");
		MessageConsumer consumer = session.createConsumer(queue);

		consumer.setMessageListener(new MessageListener() {

			@Override
			public void onMessage(Message message) {

				TextMessage textMessage = (TextMessage) message;
				String text;
				try {
					text = textMessage.getText();
					System.out.println(text);
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		});

		System.in.read();
		consumer.close();
		session.close();
		connection.close();
	}

消费者取出该消息,服务端则会销毁生产者发布的那个消息。

第二种:topic(发布-订阅)

01ActiveMQ_topic_producer

@Test
	public void testTopicProducer() throws Exception {

		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();

		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

		Topic topic = session.createTopic("test-topic");

		MessageProducer producer = session.createProducer(topic);

		TextMessage textMessage = session.createTextMessage("topic");
		producer.send(textMessage);

		producer.close();
		session.close();
		connection.close();
	}

生产者发布完消息,服务端是不会持久化保存该消息的,不管消费者是否接受到。若要消费者收到消息,则必须消费者必须在生产者之情启动。

02ActiveMQ_topic_concustomer

@Test
	public void testTopicCustomer() throws Exception {

		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();

		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

		Topic topic = session.createTopic("test-topic");

		MessageConsumer consumer = session.createConsumer(topic);

		consumer.setMessageListener(new MessageListener() {

			@Override
			public void onMessage(Message message) {
				TextMessage textMessage = (TextMessage) message;
				String text;
				try {
					text = textMessage.getText();
					System.out.println(text);
				} catch (JMSException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
		System.out.println("topic消费者03已经启动。。。。");
		// System.out.println("topic消费者02已经启动。。。。");
		// System.out.println("topic消费者01已经启动。。。。");
		System.in.read();
		consumer.close();
		session.close();
		connection.close();
	}
分别启动01 02 03 三个消费者。再启动生产者的发布消息的时候,这样三个消费者就可以接受消息了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊杰eboy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值