这期内容当中小编将会给大家带来有关RabbitMQ中如何进行SSM框架整合xml配置,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
前提:jdk1.8,本博客使用的是RabbitTemplate模版,用封装好的方法,不再使用
还有一个重点,自己一定要会使用rabbitmq服务器,自己创建exchange、queue等,不然使用该博客的话,会报错的。
两种方法:topic模式以及延迟队列的使用
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.7.11.RELEASE</version>
</dependency>
# rabbitmq 消息配置
rabbitmq.addresses=localhost:5672
rabbitmq.virtual-host=/
rabbitmq.username=guest
rabbitmq.password=guest
rabbitmq.channel-cache-size=50
rabbitmq.concurrentConsumers=3
rabbitmq.maxConcurrentConsumers=10
# 确认方式 MANUAL 手动,AUTO 自动,NONE 自动确认
rabbitmq.acknowledgeMode=MANUAL
# 线程池数量 = 并发数 * 监听数
rabbitmq.task-executor.pool-size=100
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!--启用注解监听消息-->
<rabbit:annotation-driven/>
<!-- 配置连接工厂 -->
<rabbit:connection-factory id="connectionFactory"
host="localhost"
port="5672"
username="${rabbitmq.username}"
password="${rabbitmq.password}" />
<!-- 定义mq管理 -->
<rabbit:admin connection-factory="connectionFactory" />
<!-- 声明队列 -->
<rabbit:queue name="topicqueue2" auto-declare="false" durable="true"></rabbit:queue>
<rabbit:queue name="queue_seckill" auto-declare="false" durable="true"></rabbit:queue>
<rabbit:queue name="dlx_delay_queue" auto-declare="false" durable="true">
<rabbit:queue-arguments>
<entry key="x-message-ttl" value="6000" value-type="java.lang.Long"/>
<entry key="x-dead-letter-exchange" value="dlx_delay_exchange" />
<entry key="x-dead-letter-routing-key" value="immediate_road" />
</rabbit:queue-arguments>
</rabbit:queue>
<rabbit:queue name="immediate" auto-declare="false" durable="true">
</rabbit:queue>
<!--producer-->
<!-- 定义交换机绑定队列(通配符模式) #匹配一个或多个词 *匹配一个词 -->
<rabbit:topic-exchange name="IExchange" id="IExchange">
<rabbit:bindings>
<rabbit:binding queue="topicqueue2" pattern="lazy.#"/>
<rabbit:binding queue="queue_seckill" pattern="seckill.#"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<!--延迟队列-->
<rabbit:direct-exchange name="dlx_delay_exchange" durable="true" auto-declare="false">
<rabbit:bindings>
<rabbit:binding queue="dlx_delay_queue" key="dlx_delay_road" />
<rabbit:binding queue="immediate" key="immediate_road" />
</rabbit:bindings>
</rabbit:direct-exchange>
<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter"
class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<!-- 定义模版 -->
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" message-converter="jsonMessageConverter" />
<!-- 定义消费者 -->
<bean name="delayConsumer" class="com.platform.mq.DelayListener" />
<bean name="seckillConsumer" class="com.platform.mq.SeckillHandler" />
<!-- 定义消费者监听队列 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="seckillConsumer" queues="queue_seckill" />
<rabbit:listener ref="delayConsumer" queues="immediate" />
</rabbit:listener-container>
<!--消息监听容器,配合注解监听消息-->
<bean id="rabbitListenerContainerFactory" class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<!--并发消费者数量-->
<property name="concurrentConsumers" value="${rabbitmq.concurrentConsumers:3}"/>
<!--最大数量-->
<property name="maxConcurrentConsumers" value="${rabbitmq.maxConcurrentConsumers:10}"/>
<!--消息转换-->
<property name="messageConverter" ref="jsonMessageConverter"/>
<!--任务线程池-->
<property name="taskExecutor">
<task:executor id="amqpTaskExecutor" pool-size="${rabbitmq.task-executor.pool-size:100}"/>
</property>
<!--手动确认-->
<property name="acknowledgeMode" value="MANUAL"/>
</bean>
</beans>
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
/**
* @Author:MuJiuTian
* @Description: RabbitMq延迟队列 https://blog.csdn.net/m912595719/article/details/83787486
* ChannelAwareMessageListener(Message memssage,Channel channel) MessageListener(Message message)
* @Date: Created in 下午4:17 2019/8/12
*/
public class DelayListener implements MessageListener {
@Autowired
RabbitTemplate rabbitTemplate;
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void onMessage(Message message) {
try {
JsonNode jsonData = MAPPER.readTree(message.getBody());
System.out.println("延迟队列时间为:"+DateUtil.format(new Date(), DateFormat.getDateTimeInstance()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.platform.service.SeckillService;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Author:MuJiuTian
* @Description: 秒杀消费者消费消息,监听执行业务逻辑处理
* @Date: Created in 下午5:01 2019/8/14
*/
public class SeckillHandler implements MessageListener {
@Autowired
SeckillService seckillService;
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void onMessage(Message message) {
try {
//队列中继续执行秒杀
JsonNode jsonData = MAPPER.readTree(message.getBody());
String goodsId = jsonData.get("goodsId").asText();
int productId = jsonData.get("productId").asInt();
int userId = jsonData.get("userId").asInt();
int sellerNum = jsonData.get("sellerNum").asInt();
//开始秒杀
seckillService.seckillRedis(goodsId,productId,sellerNum,userId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Mail implements Serializable {
private static final long serialVersionUID = -8140693840257585779L;
private String mailId;
private String country;
private Double weight;
public Mail() {
}
public Mail(String mailId, String country, double weight) {
this.mailId = mailId;
this.country = country;
this.weight = weight;
}
public String getMailId() {
return mailId;
}
public void setMailId(String mailId) {
this.mailId = mailId;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Mail [mailId=" + mailId + ", country=" + country + ", weight="
+ weight + "]";
}
}
/**
* topic:通配符模式
*/
@GetMapping(value = "/test7")
public void test11(){
Mail mail = new Mail("21","China",27.2);
System.out.println("topic模式发送数据到消息队列"+DateUtil.format(new Date(), DateFormat.getDateTimeInstance()));
rabbitTemplate.convertAndSend("IExchange","lazy.dtb",mail);
}
/**
* 死信队列 long等待时间,目前测试为:自动消费
*/
@GetMapping(value = "/test8")
public void test13(long time) throws IOException {
Mail mail = randomMail();
System.out.println("延迟队列:dlx方式"+DateUtil.format(new Date(), DateFormat.getDateTimeInstance()));
rabbitTemplate.convertAndSend("dlx_delay_exchange","dlx_delay_road", mail, message -> {
message.getMessageProperties().setExpiration(time + "");
return message;
});
}
/**
* 随机创建一个Mail实体对象,供接口测试
*/
public static Mail randomMail() {
Mail mail = new Mail();
mail.setMailId(new Random().nextInt(100)+"");
mail.setCountry("China");
mail.setWeight(new Random().nextDouble());
return mail;
}
上述就是小编为大家分享的RabbitMQ中如何进行SSM框架整合xml配置了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/mdxlcj/blog/3096142