springboot整合xxl-mq学习笔记
首先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下面引入:
日志管理配置:
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学习笔记的更多相关文章
- 这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
前言 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. 简洁和清晰 ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- 搭建SpringBoot、Jsp支持学习笔记
Spring Boot 添加JSP支持 大体步骤: (1) 创建Maven web project: (2) 在pom.xml文件添加依赖: (3) ...
- springboot 尚桂谷学习笔记03
------spring boot 与日志------ 日志框架: 市面上的日志框架: jul jcl jboss-logging logback log4j log4j2 ...... 左边一个门面 ...
- 【mq学习笔记】mq查找路由信息与故障延迟
路由发现:缓存中的路由信息什么时候更新呢? 由QueueData转topicPublishInfo的List<QueueMessage>: 选择消息队列: sendLatencyFault ...
- 【mq学习笔记-分布式篇】主从同步机制
核心类: 消息消费到达主服务器后需要将消息同步到从服务器,如果主服务器Broker宕机后,消息消费者可以从从服务器拉取消息. HAService:RocketMQ主从同步核心实现类 HAService ...
- 【mq学习笔记】mq 过期文件删除机制
broker不会关注这个文件上的消息是否全部被消费.默认每个文件的过期时间为72小时.
- SpringBoot整合RabbitMQ-5.7-课堂笔记-02
- Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
- [转]Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
随机推荐
- tortoisesvn 本项目的忽略项
https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html Adding and Editing Pr ...
- 使用线程池优化Echo模型
在上一篇文章中 http://www.cnblogs.com/gosaint/p/8492356.html 我阐述了使用线程为每一个客户端创建一个工作线程来负责任务的执行.但是会存在如 ...
- valgrind详解
调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1.valgrind 安装包下载地址:http://valgrind.org/downloads/repository.html(使 ...
- docker创建容器打开两个端口
docker run -d -it --name c6_3 -v :/mnt -p 5000:8000 -p 3000 centos 注释: -v 后面为共享文件夹
- iOS 打包生成ipa文件(使用终端命令打包)
1. 打开终端 2.在终端输入cd +空格 把工程文件直接拖到终端,然后回车 3. 在终端输入xcodebuild,回车 然后你可以发现工程文件里多了一个build文件夹 在build文件夹中,有一个 ...
- 27-1/x+1/y=1/n
链接:https://www.nowcoder.com/acm/contest/90/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...
- 在Mac OS里安装和升级Git
在此记录,给自己看,也给别人参考. 进入终端,查看当前Git版本,输入指令:git --version 输入which git回车,可以查看当前git在什么位置 经查,版本:2.10.0,版本较低,为 ...
- 51NOD 1371填数字
传送门 分析 此题关键在于想出dp[i][j][k]代表考虑到第i行,还能放1的的共有j列,还能放2的共有k行.之后就枚举每一行是没有还是1个1还是2个1还是1个2,然后转移即可. 代码 #inclu ...
- zookeeper集群安装(转)
转载地址:http://www.blogjava.net/hello-yun/archive/2012/05/03/377250.html 本方法,本人亲自试验,可以成功. ZooKeeper是一个分 ...
- PL/SQL与SQL(Oracle)Case语句
(使用scott账户下的表) 1.Oracle SQL语句的case语句写法: --sql中的case用于分支判断并返回某个值. select empno , ename, deptno , case ...