ActiveMQ

 

activeMQ简介

  1. 多种语言和协议编写客户端
  2. 完全支持JMS1.1和J2EE1.4规范
  3. 对Springde zhichi ,ActiveMQ很容易内嵌到使用Spring的系统中
  4. 支持多种传送协议
  5. 支持通过JDBC和journal提供高速的消息持久化
  6. 从设计上保证了高性能的集群,客户端端-服务器,点对点
  7. 支持Ajax
  8. 支持与Axis的整合,WebServices
  9. 可以很容易的调用内嵌JMSprovider,进行测试

JMS名词解释

  1. Destination:目的地,JMS Provider(消息中间件)负责维护,用于对Message进行管理的对象,MessageProducer需要指定Destination才能消息,MessageConsumer需要指定Destination才能接受消
  2.  Producer:消息生成者,负责发送Message到目的地,应用接口为MessageProducer。在JMS规范中,所有的标准定义在JAVAX.JMS包中
  3. Consumer:消息消费者,负责从目的地中消息【处理|监听|订阅】Message,应用接口为MessageConsumer
  4. Message:消息,消息封装一次同学的内容。常见的类型有:StreamMessage、BytesMesasge、TextMessage、ObjectMessage、MapMessage。
  5. Queue(队列目的地)&Topic(主题目的地):都是Destination的子接口,Queue特点:队列中的消息,默认只能由唯一的一个消费者处理,一旦处理消息删除;Topic特点:主题中的消息,会发送给所有的消费者同事处理,只有在消息可以重复处理的业务场景中课使用;
  6. PTP(Point to Point):点对点消息模型,就是基于Queue实现的消息处理方式;
  7. PUB&SUB(Publish & Subscribe):消息的发布、订阅模型,是基于Topic实现的消息处理方式

PTP处理模式

消息生产者生产消息发送到 queue 中,然后消息消费者从 queue 中取出并且消费消息。 消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消
息。
Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费、其它 的则不能消费此消息了。 当消费者不存在时,消息会一直保存,直到有消费消费


// 生产者
@Service
public class ProducterService {

	@Autowired
	private JmsMessagingTemplate jmsMessagingTemplate;
	
	public void sendMsg(String msg){
		jmsMessagingTemplate.convertAndSend("msg", msg);
		System.out.println("msg:"+msg+"\t发送成功!");
	}
}

// 消费者
@Service
public class ConsumeService {

	@JmsListener(destination="msg")
	public void receiveMsg(String msg){
		System.out.println("接受消息:"+msg);
	}
}

// 测试类

@SpringBootTest(classes=App.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ProducterTest {

	@Autowired
	private ProducterService producterService;
	
	@Test
	public void testPro1(){
		for(int i=1;i<=10;i++){
			System.out.println("send---start");
			producterService.sendMsg("study--" + i);
			System.out.println("send---end\n");
		}
	}
}


输出内容:
send---start
接受消息:study--1
msg:study--1	发送成功!
send---end

send---start
接受消息:study--2
msg:study--2	发送成功!
send---end

send---start
接受消息:study--3
msg:study--3	发送成功!
send---end

send---start
接受消息:study--4
msg:study--4	发送成功!
send---end

send---start
接受消息:study--5
msg:study--5	发送成功!
send---end

send---start
接受消息:study--6
msg:study--6	发送成功!
send---end

send---start
接受消息:study--7
msg:study--7	发送成功!
send---end

send---start
接受消息:study--8
msg:study--8	发送成功!
send---end

send---start
接受消息:study--9
msg:study--9	发送成功!
send---end

send---start
接受消息:study--10
msg:study--10	发送成功!
send---end

 Publish/Subscribe 处理模式(Topic)

消息生产者(发布)将消息发布到topic中,同事有多个消息消费者(订阅)消费该消息,

和点对点方式不同,发布到topic的消息会被所有订阅者消费。

当生产者发布消息,不管是否有消费者。都不会保存消息,

一定要先有消息的消费者,后有消息的生产者。

package com.mq.service;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;

@Service
public class ConsumeService {

	@JmsListener(destination="msg")
	public void receiveMsg(String msg){
		System.out.println("msg-接受消息:"+msg);
	}
	
	@JmsListener(destination="msg")
	public void receiveMsg2(String msg){
		System.out.println("msg2接受消息:"+msg);
	}
	
	@JmsListener(destination="topic")
	public void receiveTopic(String msg){
		System.out.println("topic接受消息:"+msg);
	}
	
	@JmsListener(destination="topic")
	public void receiveTopic2(String msg){
		System.out.println("topic2接受消息:"+msg);
	}
}


package com.mq.service;

import javax.jms.Destination;
import javax.jms.Queue;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

@Service
public class ProducterService {

	@Autowired
	private JmsMessagingTemplate jmsMessagingTemplate;
	
/*	@Autowired
	private Queue queue;*/
	
	public void sendMsg(Destination destination,String msg){
		jmsMessagingTemplate.convertAndSend(destination, msg);
		System.out.println("msg:"+msg+"\t发送成功!");
	}
}


package activemqTest;

import javax.jms.Destination;
import javax.jms.Queue;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.ActiveMQTopic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.mq.App;
import com.mq.service.ProducterService;

@SpringBootTest(classes=App.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ProducterTest {

	@Autowired
	private ProducterService producterService;
	
	
	@Test
	public void testPro1(){
		/*Destination destination1 = new ActiveMQQueue("msg");
		for(int i=10;i<=15;i++){
			System.out.println("send---start");
			producterService.sendMsg(destination1,"destination1:" + i);
			System.out.println("send---end\n");
		}
		
		System.out.println("*******************\n");*/
		// spring.jms.pub-sub-domain=true
		Destination destination2 = new ActiveMQTopic("topic");
		for(int i=1;i<=5;i++){
			System.out.println("send---start");
			producterService.sendMsg(destination2,"destination1:" + i);
			System.out.println("send---end\n");
		}
	}
}

 

具体代码,请参照https://download.csdn.net/download/hualele/11163307

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值