MQ是什么?

MQ(消息队列)是一种跨进程的通信机制,用于上下游传递消息。

MQ的优点

异步处理,代码解藕。

spring中集成MQ的实现

1. xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!-- windq配置start -->
<!-- 生产者配置 -->
<!-- JMS 连接工厂,必须配置destroy-method,会在停应用时,显式地销毁资源 -->
<bean id="windqConnectionFactory" class="com.xxx.windq.jms.WindQConnectionFactory" destroy-method="destroy">
</bean>
<!-- 定义队列 -->
<bean id="fundDetailRequestQueue" class="com.xxx.windq.jms.destination.WindQQueue">
<!--请求资金明细的队列名称-->
<constructor-arg value="FUND_DETAIL_REQUEST_TTMS"/>
</bean>
<!-- 缓存session连接工厂,只可用于jmsTemplate发送消息,不可用于MessageListenerContainer -->
<bean id="cacheConnectionFactory" class="com.xxx.windq.spring.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="windqConnectionFactory"/>
<!-- 缓存住的会话数,如果并发峰值超出此阈值仍然会新建会话,只是这些新建的会话在idle后会被关闭。此值应填写正常情况下的并发量 -->
<property name="sessionCacheSize" value="20"/>
</bean>
<bean id="windqJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cacheConnectionFactory"/>
</bean>
<!-- 用来发送消息的Service实例 -->
<bean id="jmsFundDetailRequestSender" class="com.xxx.fms.remit.jms.JmsFundDetailRequestSender">
<property name="jmsTemplate" ref="windqJmsTemplate"/>
<!-- 此处关联定义的队列或主题 -->
<property name="queueOrTopic" ref="fundDetailRequestQueue"/>
</bean> <!-- 消费者配置 -->
<!-- 用来接收消息的Listener实例 -->
<bean id="jmsFundDetailListener" class="com.xxx.fms.remit.jms.JmsFundDetailListener"/>
<bean id="listenerContainer" class="com.xxx.windq.spring.DefaultMessageListenerContainer">
<!-- 使用WINDQ原生的连接工厂,不要使用cachingConnectionFactory,因为MLC自己内部有缓存机制 -->
<property name="connectionFactory" ref="windqConnectionFactory"/>
<!-- 填写上述定义中的实际要消费的队列(该队列由资金系统提供) -->
<property name="destination" ref="myQueue"/>
<!-- 业务处理类 -->
<property name="messageListener" ref="jmsFundDetailListener"/>
<!--单个JVM的并发consumer的数量:最小-最大。例如1-1,表示最小的和最大的并发消费者数量都是1 -->
<property name="concurrency" value="1-1"/>
<!-- 打开JMS会话事务(非JTA事务),session类型为transaction -->
<property name="sessionTransacted" value="true"/>
</bean>
<!-- windq配置end -->
</beans>

2. 生产者JmsFundDetailRequestSender实现:

@Component("jmsFundDetailRequestSender")
class JmsFundDetailRequestSender { private static Logger LOGGER = LoggerFactory.getLogger(JmsFundDetailRequestSender.class); private Destination queueOrTopic; private JmsTemplate jmsTemplate; /**
* 向指定队列发送消息
* @param message
*/
public void sendMessage(final Serializable message) {
LOGGER.info("发送资金明细查询windq请求,sendMessage:{}", ToStringBuilder.reflectionToString(message));
jmsTemplate.send(queueOrTopic, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
ObjectMessage objectMessage = session.createObjectMessage();
// 如果需要设置以下任一属性头,就调用下clearProperties()方法,默认是不允许设置属性的,这个语句会打开属性变为可设置
objectMessage.clearProperties();
// 定位本条消息的业务字段,用于消息日志查询。例如如果填写订单号,那么通过订单号就能查询到这条消息。非必填字段
objectMessage.setStringProperty(MessageHeader.WINDQ_MSG_ABSTRACT_HEADER, message.toString());
// 填写消息体
objectMessage.setObject(message);
return objectMessage;
}
});
} public Destination getQueueOrTopic() {
return queueOrTopic;
} public void setQueueOrTopic(Destination queueOrTopic) {
this.queueOrTopic = queueOrTopic;
} public JmsTemplate getJmsTemplate() {
return jmsTemplate;
} public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
}

注:代码中用到了匿名内部类,有关匿名内部类的解释,可以查看匿名内部类详解

3. 消费者JmsFundDetailListener实现:

@Component("jmsFundDetailListener")
public class JmsFundDetailListener implements MessageListener { @Override
public void onMessage(Message message) {
if (message != null) {
// 业务处理代码
}
}
}

MQ实战的更多相关文章

  1. celery+Rabbit MQ实战记录

    基于以前的一篇文章,celery+Rabbit MQ的安装和使用, 本文更加详细的介绍如何安装和使用celey, Rabbit MQ. 并记录在使用celery时遇到的一些问题. 1.安装 Rabbi ...

  2. Active MQ 实战(一)

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  3. RabbitMQ系列随笔——介绍及安装

    一.RabbitMQ介绍 RabbitMQ是由erlang开发的AMQP(Advanced Message Queuing Protocol)的开源实现.他是高级消息队列协议,是应用层协议的一个开放标 ...

  4. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

  5. ElasticSearch实战-日志监控平台

    1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件——ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...

  6. 单元测试系列:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  7. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

  8. 【MQ】消息队列及常见MQ比较

    一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰. ...

  9. springboot 实战之一站式开发体验

    都说springboot是新形势的主流框架工具,然而我的工作中并没有真正用到springboot: 都说springboot里面并没有什么新技术,不过是组合了现有的组件而已,但是自己却说不出来: 都说 ...

随机推荐

  1. [git]入门-工作区、暂存区、版本库

    转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256 ...

  2. Spring源码学习(7)——AOP

    我们知道,使用面对对象编程的时候有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志.安全检测等,所以就有了一个对面对对象编程的补充,即面对切面编程(AOP),AOP所关注的方向 ...

  3. Linux:Red Hat系统的安装

    今天高兴,所以我写这一期,这一期写的是Red Hat系统的安装,这个开发系统也是红帽企业制作出来的,关于这款系统的相关资料就自行百度吧!话不多说,直接进入这期的内容吧! 安装Red Hat系统 系统下 ...

  4. L364 Should Your Resume Be One Page or Two?

    Should Your Resume Be One Page or Two? Conventional wisdom suggests that you should keep it short: A ...

  5. svn初涉及使用

    SVN是为了代码版本控制而生的,为集中式设计. SVN下载   我的为Windows系统,有6种版本SVN可选择,关于选取哪种参见    Windows平台下不同版本SVN对比 我选择了上述博主推荐的 ...

  6. datetime模块

    # 其中days = -2,可以根据需要进行替换,这样就可以得到不同需要的日期了. # # 另外:可以通过strftime方法,指定时间的输出格式. # # 除了以上输入的   %Y-%m-%d    ...

  7. Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

    pycharm运行TensorFlow警告:Your CPU supports instructions that this TensorFlow binary was not compiled to ...

  8. TP5 生成二维码

    首先下载这个类:http://phpqrcode.sourceforge.net/ 把下载的文件放到vendor下面 public function getWchatQrcode($users_id= ...

  9. python 离群点检测

    import numpy as np import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot a ...

  10. 埃式筛法——求n以内素数

    素数筛法的关键就在一个“筛”字.算法从小到大枚举所有数,对每一个素数,筛去它的所有倍数,剩下的就都是素数了. 例如:求1-15中的所有素数. 1.  2是素数(唯一需要事先确定的),因此筛去2的所有倍 ...