首先xxl-mq是大神xuxueli开发的一个消息中间件框架:

与springboot整合过程:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-mq-samples</artifactId>
<version>1.3.-SNAPSHOT</version>
</parent>
<modelVersion>4.0.</modelVersion>
<artifactId>xxl-mq-samples-springboot</artifactId>
<packaging>jar</packaging> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies> <!-- starter-web:spring-webmvc + autoconfigure + logback + yaml + tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- starter-test:junit + spring-test + mockito -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- freemarker-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency> <!-- xxl-mq-client -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-mq-client</artifactId>
<version>${parent.version}</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

2  propeties

### web
server.port=
server.context-path=/ ### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/ ### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.########## # xxl-mq, admin conf 这个配置时admin部署的位置
xxl.mq.admin.address=http://localhost:8080/xxl-mq-admin
### xxl-mq, access token
xxl.mq.accessToken=

index。html

<script src="${request.contextPath}/static/jquery/jquery.min.js"></script>
<body> <input type="button" class="send" _type="" value="并行消费" />
<br><br> <input type="button" class="send" _type="" value="串行消费" />
<br><br> <input type="button" class="send" _type="" value="广播消息" />
<br><br> <input type="button" class="send" _type="" value="延时消息:5分钟后执行" />
<br><br> <input type="button" class="send" _type="" value="性能测试:批量发送10000条消息" /> <hr>
<div id="console"></div> <script>
$(function(){
$(".send").click(function () {
var _type = $(this).attr("_type");
$.post( '${request.contextPath}/produce', {'type':_type}, function(data,status){
var temp = "<br>" + new Date().format("yyyy-MM-dd HH:mm:ss") + ": ";
temp += ("SUCCESS" == data)?('成功发送一条消息!'):data;
$("#console").prepend(temp);
});
});
}); // Format
Date.prototype.format = function(fmt) {
var o = {
"M+" : this.getMonth()+, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+)/), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$, (this.getFullYear()+"").substr( - RegExp.$.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$, (RegExp.$.length==) ? (o[k]) : ((""+ o[k]).substr((""+ o[k]).length)));
return fmt;
} </script> </body>

需要在juery下面引入:

jquery.min.js

日志管理配置:

logback。xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds"> <contextName>logback</contextName>
<property name="log.path" value="/data/applogs/xxl-mq/xxl-mq-samples-springboot.log"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{} - %msg%n</pattern>
</encoder>
</appender> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{} [%file : %line] %msg%n
</pattern>
</encoder>
</appender> <root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root> </configuration>

配置XxlMqConf.java:

package com.xxl.mq.sample.springboot.conf;

import com.xxl.mq.client.factory.impl.XxlMqSpringClientFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; @Component
public class XxlMqConf { // ---------------------- param ---------------------- @Value("${xxl.mq.admin.address}")
private String adminAddress;
@Value("${xxl.mq.accessToken}")
private String accessToken; @Bean
public XxlMqSpringClientFactory getXxlMqConsumer(){ XxlMqSpringClientFactory xxlMqSpringClientFactory = new XxlMqSpringClientFactory();
xxlMqSpringClientFactory.setAdminAddress(adminAddress);
xxlMqSpringClientFactory.setAccessToken(accessToken); return xxlMqSpringClientFactory;
} }

controller 根据传入的参数进行设置:


import com.xxl.mq.client.message.XxlMqMessage;
import com.xxl.mq.client.producer.XxlMqProducer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import java.util.Calendar;
import java.util.Date; /**
* index controller
* @author xuxueli 2015-12-19 16:13:16
*/
@Controller
public class IndexController { @RequestMapping("/")
public String index(){
return "index";
} @RequestMapping("/produce")
@ResponseBody
public String produce(int type){ String topic = "topic_1";
String data = "时间戳:" + System.currentTimeMillis(); if (type == ) { /**
* 并行消费
*/
XxlMqProducer.produce(new XxlMqMessage(topic, data)); } else if (type == ) { /**
* 串行消费
*/
XxlMqProducer.produce(new XxlMqMessage(topic, data, 1L)); } else if (type == ) { /**
* 广播消费
*/
XxlMqProducer.broadcast(new XxlMqMessage(topic, data)); } else if (type == ) { Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, );
Date effectTime = calendar.getTime(); /**
* 延时消息
*/
XxlMqProducer.produce(new XxlMqMessage(topic, data, effectTime)); } else if (type == ) { int msgNum = ;
long start = System.currentTimeMillis();
for (int i = ; i < msgNum; i++) {
XxlMqProducer.produce(new XxlMqMessage("topic_1", "No:"+i));
}
long end = System.currentTimeMillis();
return "Cost = " + (end-start); } else {
return "Type Error.";
} return "SUCCESS";
} @ExceptionHandler({Exception.class})
public String exception(Exception e) {
e.printStackTrace();
return e.getMessage();
} }

对应的消费者:

import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; /**
* Created by xuxueli on 16/8/28.
*/
@MqConsumer(topic = "topic_2")
@Service
public class Demo2MqComsumer implements IMqConsumer {
private Logger logger = LoggerFactory.getLogger(Demo2MqComsumer.class); @Override
public MqResult consume(String data) throws Exception {
logger.info("[Demo2MqComsumer] 消费一条消息:{}", data);
return MqResult.SUCCESS;
} }
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; /**
* Created by xuxueli on 16/8/28.
*/
@MqConsumer(topic = "topic_1")
@Service
public class DemoAMqComsumer implements IMqConsumer {
private Logger logger = LoggerFactory.getLogger(DemoAMqComsumer.class); @Override
public MqResult consume(String data) throws Exception {
logger.info("[DemoAMqComsumer] 消费一条消息:{}", data);
return MqResult.SUCCESS;
} }
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; /**
* Created by xuxueli on 16/8/28.
*/
@MqConsumer(topic = "topic_1")
@Service
public class DemoBMqComsumer implements IMqConsumer {
private Logger logger = LoggerFactory.getLogger(DemoBMqComsumer.class); @Override
public MqResult consume(String data) throws Exception {
logger.info("[DemoBMqComsumer] 消费一条消息:{}", data);
return MqResult.SUCCESS;
} }
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; /**
* Created by xuxueli on 16/8/28.
*/
@MqConsumer(topic = "topic_1", group = MqConsumer.EMPTY_GROUP)
@Service
public class DemoCMqComsumer implements IMqConsumer {
private Logger logger = LoggerFactory.getLogger(DemoCMqComsumer.class); @Override
public MqResult consume(String data) throws Exception {
logger.info("[DemoCMqComsumer] 消费一条消息:{}", data);
return MqResult.SUCCESS;
} }

springboot整合xxl-mq学习笔记的更多相关文章

  1. 这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了

    前言 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰 ...

  2. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  3. 搭建SpringBoot、Jsp支持学习笔记

    Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)     ...

  4. springboot 尚桂谷学习笔记03

    ------spring boot 与日志------ 日志框架: 市面上的日志框架: jul jcl jboss-logging logback log4j log4j2 ...... 左边一个门面 ...

  5. 【mq学习笔记】mq查找路由信息与故障延迟

    路由发现:缓存中的路由信息什么时候更新呢? 由QueueData转topicPublishInfo的List<QueueMessage>: 选择消息队列: sendLatencyFault ...

  6. 【mq学习笔记-分布式篇】主从同步机制

    核心类: 消息消费到达主服务器后需要将消息同步到从服务器,如果主服务器Broker宕机后,消息消费者可以从从服务器拉取消息. HAService:RocketMQ主从同步核心实现类 HAService ...

  7. 【mq学习笔记】mq 过期文件删除机制

    broker不会关注这个文件上的消息是否全部被消费.默认每个文件的过期时间为72小时.

  8. SpringBoot整合RabbitMQ-5.7-课堂笔记-02

  9. Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

  10. [转]Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

随机推荐

  1. CDM中,实体与实体快捷方式之间的联系不能重复,否则会造成外键重复

    例如机场实体和跑道实体,例如: 在机场包中,跑道实体作为快捷方式出现,机场实体与跑道快捷方式实体间有连线关系,然而 在跑道包中,情况相反,但二者间也有连线.(模型原样) 要注意的是,虽然在两个包中都有 ...

  2. #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息

    #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...

  3. css 文件上传按钮美化

    转自:http://zixuephp.net/article-85.html 思路:在一个div里面添加一个图片用作按钮再添加一个input file 文件上传,把文件上传按钮设置透明度为0,绝对定位 ...

  4. springmvc 类型转换器 自定义类型转换器

    自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: springmvc 类型转换器 表单数据填错后返回表单页面(接上面的 ...

  5. 将一个string字符串变量分解为字符输出

    我们定义一个string 变量str ,然后通过str.length()可以获得该字符串变量的长度: #include<iostream> #include<string> u ...

  6. DB2--sql计算时间差和格式化时间

    格式化时间 db2 格式化时间使用的 TO_CHAR(TIMESTAMP('2017-10-24 21:18:12'),'YYYY-MM-DD'): 测试sql:SELECT TO_CHAR(TIME ...

  7. 适合新手的Python爬虫小程序

    介绍:此程序是使用python做的一个爬虫小程序  爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...

  8. java中是如何解决编码问题的,比如char类型的对象是如何存储的呢?

    主题句:每个编码形式将字符从字符集转换为编码数据. 说白了一个代码点就是一个Unicode字符.代码单元就是代码点的集合. 字符视图 要了解字符集标准,您必须能区分三种不同的字符视图: 字符集(字符的 ...

  9. GCD学习(六) dispatch_async 和dispatch_sync

    dispatch_sync(),同步添加操作.他是等待添加进队列里面的操作完成之后再继续执行. dispatch_queue_t concurrentQueue = dispatch_queue_cr ...

  10. p4377 [USACO18OPEN]Talent Show

    传送门 分析 经典的01分数规划问题 用01背包check即可 代码 #include<iostream> #include<cstdio> #include<cstri ...