开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator

The best way to predict the future is to invent it. 预测未来的最好方法就是创造未来。 -- 沃尔特·艾萨克森 《乔布斯传》
青离 发布于 17小时前 阅读 121

Shiro实现多域名登录界面

背景 目前开发接到需求如下,希望根据不同用户实现自定义域名登录(前台ui等需要略微区分,配色,皮肤等) 现状 目前系统中使用shiro作为授权权限框架,当用户没有登录时将会默认返回未授权页 比如  <!-- 配置shiroFilter--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="${wxb.url}"/> <property name="successUrl" value="/kzf6/page/index/index.jsp" /> <property name="unauthorizedUrl" value="/kzf6/page/error/403.jsp" /> <property name="filters"> <map> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </map> </property> <property name="filterChainDefinitions"> <value> /mlogin/login.json = anon <!-- 除了上面定义的url和资源,都需要配认证后才可以访问 --> /** = kickout,authc </value> </property> </bean> 上述配置可以导致未登录用户来自动重定向到${w...
Mr_Qi 发布于 18小时前 阅读 224 评论 2 点赞 1

Golang面试题解析(二)

## 12.是否可以编译通过?如果通过,输出什么? ```go func main() { i := GetValue() switch i.(type) { case int: println("int") case string: println("string") case interface{}: println("interface") default: println("unknown") } } func GetValue() int { return 1 } ``` ### 解析 考点:**type** 编译失败,因为type只能使用在interface ## 13.下面函数有什么问题? ```go func funcMui(x,y int)(sum int,error){ return x+y,nil } ``` ### 解析 考点:**函数返回值命名** 在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。 如果返回值有有多个返回值必须加上括号; 如果只有一个返回值并且有命名也需要加上括号; 此处函数第一个返回值有sum名称,第二个未命名,所以错误。 ## 14.是否可以编译通过?如果通过,输出什么? ```go package main func main() { println(DeferFunc1(1)) println(DeferFunc2(1)) println(DeferFunc3(1)) } func DeferFunc1(i int) (t int) { t = i defer func() { t += 3 }() return t } func DeferFunc2(i int) int { t := i defer func() { t += 3 }() return t } func DeferFunc3(i int) (t int) { defe...
梦朝思夕 发布于 3天前 阅读 557 评论 6 点赞 1 打赏 1

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

Restful API利器——RestPack项目教程

## 目录 * 项目背景 * RestPack 简介 * 源码下载 * 软件版本 * 配置 terran4j 的 Maven 仓库 * 引入 RestPack 依赖 * 启用 RestPack * @RestPackController 注解 * RestPack 异常处理 * 日志输出 * 资源分享与技术交流 ## 项目背景 在互联网、移动互联网、车联网、物联网繁荣的今天,各种客户端设备层出不穷,为了能用同一套服务端程序处理各种客户端的访问,[ HTTP Restful API ](http://www.ruanyifeng.com/blog/2014/05/restful_api.html) 变得流行起来。 但是客户端与服务端交互时,往往会有一些通用的需求,比如: * 服务端在处理一个 API 请求时,如果出异常了,总是希望在请求的返回结果中给出一个明确的错误码,客户端可以根据错误码作进一步的处理。 * 为了方便排查问题,总是希望对于每个请求,服务端会返回一个 requestId,后台可以将这个请求产生的日志与这个 requestId 相关联。 这样一旦前后端联调时发现了问题,前端工程师只要给出 requestId ,后台工程师就可以拿着这个 requestId 快速找出相关日志,方便分析排查问题。 ...... 为了满足这些非功能性需求,笔者总结了之前很多项目的开发经验,归纳出一套统一的数据返回格式,如下(分成功和失败两种情况)...
terran4j 发布于 4天前 阅读 297 评论 5

加速前后端并行开发,JApiDocs 可以帮到你

JApiDocs 作为一个衔接前后端开发的的工具,尽可能把重复劳动都自动化了,实现了代码即文档,持续集成接口测试的小目标,非常优雅的解决在前后端并行开发碰到的一些问题。
叶大侠 发布于 4天前 阅读 395 评论 2

通过ssh远程连接docker中的容器

需求: 想自己搭建一个ubuntu的lnmp环境,但是使用powershell的时候,各种别扭,所以就考虑远程连接,通过putty或者xshell来连接   环境: 系统:Win10 docker:Version 17.06.0-ce-win19 (12801) 容器管理:kitematic for windows 远程连接工具:xshell 容器系统:ubuntu   过程: 一、下载ubuntu容器 从ketematic中下载官方最新版ubuntu 备注:1、推荐使用阿里云或者国内的其他镜像,速度非常快 2、如果不用ubuntu,你也可以使用其他linux发行版,都是类似操作   二、准备工作 因为新装的官方ubuntu中很多命令都没有,需要自己安装 apt-get update apt-get install vim   给root初始化密码 sudo passwd root(如果sudo命令不存在,使用passwd root) 然后设置密码即可,比如我直接设置的密码就为root   备注:1、如果你不想用root账号,可以增加其他账号,ssh配置和登录的时候使用其他账号即可   三、安装ssh 安装 apt-get install openssh-server 查看状态 service ssh status 开启ssh service ssh start   四、配置ssh,运行root登录 vim /etc/ssh/sshd_config   PermitRootLogin的值从prohibit-password改为yes   如下: - PermitRootLogin prohibit-passw...
卖小女孩的小火柴 发布于 5天前 阅读 89

Laravel 与 Alpaca-Spa 实现前后分离开发后台管理系统

Laravel 与 Alpaca-Spa前后端分离开发的一个后台管理系统的DEMO。Laravel用来实现后端功能,Alpaca-Spa用来实现前端功能,前后端之间通过Json交换数据。
大弹簧 发布于 6天前 阅读 298 点赞 1

从设计上规避Go语言的 interface{} == nil 判断容易出错的简单办法

Go语言的interface{} 本质上是一个结构,含有一个type字段,一个pointer字段。 很多初学者会拿一个已经在某种情况下被赋予类型的interface{}和nil比较,然后惊讶的发现两者居然不等。 其实,从设计上,我们可以很容易规避这个问题,那就是利用Go的函数多返回值特性,在一般返回值后增加一个 ok bool类型的返回值,即可。 使用的时候,只判断最后一项返回值 ok 是不是等于true即可,完美避免了陷入x可能带有类型信息的麻烦。 对此有怀疑的同学可以比较下下面两种情况: 深究起来是因为任何指针赋值给interface{}的时候,都会把interface{}的类型信息字段给填上,于是就不等于nil了。再看下面这个例子: 变量t是一个空指针,赋值给i以后,i就不等于nil了。 为了代码的清晰可读,我建议采用本文开头推荐的函数返回值设计,绕开本文所描述的陷阱。          
LinkerLin 发布于 6天前 阅读 852 评论 10

PHP实现定时任务(非linux-shell方式,与操作系统无关)

用PHP实现定时任务(非linux-shell方式,与操作系统平无关)。适用于定时精确时间不低于1秒。web服务重启、或者php重启。该定时任务不会自动重启。可以用来处理大部分定时任务的结局方案,商城定时自动收货,关闭评论,订单回滚;定时发送邮件,数据备份等
大弹簧 发布于 7天前 阅读 2429 评论 29 点赞 3

JMS实现参数的集中式管理

前言 上一篇文件Zookeeper实现参数的集中式管理介绍了使用Zookeeper对节点的监听通知机制简单实现了对参数的集中式管理,其实JMS的发布订阅机制也能实现类似的功能,集群节点通过订阅指定的节点,同时使用jms对消息的过滤器功能,实现对指定参数的更新,本文将介绍通过JMS实现简单的参数集中式管理。 Maven引入 Spring相关的jar引入参考上一篇文章 <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.10.0</version> </dependency> 目标 1.可以同时配置监听多个节点如/app1,/app2; 2.希望只需要配置如/app1,就能够监听其子节点如/app1/modual1以及子节点的子节点如/app1/modual1/xxx/…; 3.服务器启动能获取当前指定父节点下的所有子节点数据; 4.在添加节点或者在更新节点数据的时候能够动态通知,这样代码中就能够实时获取最新的数据; 5.spring配置中可以从Zookeeper中读取参数进行初始化。 虽然在实现的方式上有点区别,但是最终达成的目标是一致的,同样列出了这5条目...
ksfzhaohui 发布于 1周前 阅读 310

如何实施开源协议,以及如何遵守开源协议的要求

网上有很多开源协议的介绍,但是很少有说明如何在你自己开发的软件中使用开源协议,保护自己的代码;以及当你使用别人开源项目时,如何遵守开源协议里面约定的行为。文本从github上找了些项目举例描述下这2个问题。至于各个协议的具体说明网上一搜一大堆,本文不再描述。 如何定义自己软件的开源协议 假如你要开源自己写的一个软件,那你需要进行2步来实施开源协议: 第1步: 在项目的根目录放置一个LICENSE或者COPYING文件,这个文件里面是你所使用的开源协议的具体细则,比如你用的是MIT License协议,你只需要到网上拷贝一个MIT License协议正文进来就可以了,比如vsa这个项目,使用的是Apache License 2.0开源协议,协议的正文在这里。 第2步: .在你项目的每个源文件中加入版权声明,比如vsa项目中的这个文件加入了如下的版权声明。 #!/usr/bin/env python # vim: tabstop=4 shiftwidth=4 softtabstop=4 # # Copyright 2013 Mellanox Technologies, Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache...
二两棉 发布于 1周前 阅读 241

自下向上的编写容易阅读的代码(上)

我在 [关于极简编程的思考](https://my.oschina.net/xiandafu/blog/894155) 中曾提到要编写可阅读的代码。因为代码是编写一次,阅读多次。 阅读者包括代码编写者,以及后来的维护人员。能让阅读代码更轻松,有利于增强项目或者产品的可维护性。 本博客分为上下俩部分,第一部分讲解在代码层次 编写可阅读的代码, 第二部分讲解方法,类,以及一些设计上的考虑 让代码更适合阅读。这些都是我在实际工作的一些体会以及代码审查过程中跟同事一起得出的一些经验。没有太高深的理论,适合所有人借鉴交流。 # 代码层次(上) ## if 语句保持主流程畅通 ``` if(xxx){ return false; } if(yyy){ return false; } if(zzz){ throw new Exception(); } //主逻辑代码在下面 ....... return true; ``` 使用if语句,对于不符合主逻辑的,要尽早返回,这样可以减轻代码阅读者的负担,下次再看,直接就可以从主逻辑开始。直接跳过不关心的代码块(这样代码块必然返回都是fasle) 如下是一个不好的例子 ``` if(xxx){ return false; } if(yyy){ return true; } //主逻辑代码在下面 ``` 在主逻辑前面分别返回了true 或者 false,阅读者会造成混乱,因为说明这个方法任何一处都有可能返回不同的...
闲大赋 发布于 1周前 阅读 2594 评论 35 点赞 22

Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】

> 本篇作为《Spring Cloud微服务实战》一书关于Spring Cloud Zuul网关在Dalston版本对异常处理的补充。没有看过本书的读书也不要紧,可以先阅读我之前的两篇博文:[《Spring Cloud实战小贴士:Zuul统一异常处理(一)》](http://blog.didispace.com/spring-cloud-zuul-exception-1/)和[《Spring Cloud实战小贴士:Zuul统一异常处理(二)》](http://blog.didispace.com/spring-cloud-zuul-exception-2/),这两篇文章都详细介绍和分析了Spring Cloud Zuul在过滤器设计中对异常处理的不足。同时,在这两篇文章中,也针对不足之处做了相应的解决方案。不过,这些方案都是基于Brixton版本所做的,在最新的Dalston版本中,Spring Cloud Zuul做了一些优化,所以我们不再需要做这些扩展就已经能够正确的处理异常信息了。那么,在Dalston版中,Spring Cloud Zuul中做了怎么样的修改以达到之前我们自己扩展的效果呢? ## 过滤器类型的变更 读者是否还记得我们之前分析了Spring Cloud Zuul自带的核心过滤器有哪些呢?我们先根据下图回忆一下: ![](http://blog.didispace.com/content/images/posts/spring-cloud-zuul-exception-3-1.png) 这次主要将`SendErrorFilter`过滤器的类型从`...
程序猿DD 发布于 1周前 阅读 686 评论 1

Spring源码-AOP(三)-Spring AOP的四种实现

There is a crack in everything, That's how the light gets in. 万物皆有裂缝,那是光照进来的地方。 -- 莱昂纳多 科恩
青离 发布于 1周前 阅读 997 评论 4

基于 CSP 的设计思想和 OOP 设计思想的异同

Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的角度看,CSP和OOP到底有什么区别。 下面,我们来看一个例子,如果我们有一个项目,需要做一个TCP连接中继器( 请原谅我的用词)。我们先按照OOP来设计下: 系统的结构:需要有一个客户端和一个服务器端。分两个进程分别跑在不同机器上。 系统对象关系拆分(这里有所简化,E-R图等省略):连接中继器类--系统的主类、config类--描述配置的类、connection类--每个连接一个conn类的实例、pipe类--提供一个管道,把上游的连接和下游的连接打通,把数据从A--pipe--B、encrypt工具类,提供各种加解密工具。 理清楚系统中各种对象(类)的作用关系,设计接口的细节。这里的接口,其实就是对象之间相互发送的同步阻塞的消息。 设计错误处理,日志等。 从性能方面审视整个设计,优化。 ===== 好,我们再按CSP的思路来设计下,是这么一个过程: 我们需要一个 main 协程来处理各种命令行参数的配置,收集处理配置文件; 如果是server,那么初始化server的主协程 -- tcpRemote;如果是client,则启动client的主协程 -- tcpLocal; 分...
LinkerLin 发布于 1周前 阅读 1831 评论 7 点赞 3

使用PostgreSQL 9.6 架设mediawiki服务器

近期,一直想架设一个自己的知识库,选来选去,最后选择这个能用PG做后台,其次也是我比较喜欢的MediaWiki作为自己的知识库平台,在此写一下架设过程,以作备忘,其次也希望能够帮助有需要的人。
PGSmith 发布于 1周前 阅读 322

当 Thrift 遇到 JDK Epoll Bug

将会擦出怎样的火花呢?
輕風 发布于 1周前 阅读 1732 评论 22 点赞 6

Data loader 对某个对象定时备份

1. data loader 命令行配置 2. 修改启动dataloader配置文件 3. 新建windows的计划任务
在山的那边 发布于 1周前 阅读 130 评论 1

微服务架构

微服务架构     微服务是系统架构上的设计风格,主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于http的RESTful AP进行通信协作。被拆分成的每一个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。 与单体系统的区别     传统的企业系统中,针对一个复杂的业务需求通常使用对象或业务类型来构建一个单体项目。     在项目中通常将需求分为三个主要部分:数据库、服务端处理、前端展现。在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署、都比较容易方便。但是企业发展,系统为了应对不同的业务需求会不断为该单体项目增加不同的业务模块;同时随着移动端设备的进步,前端展现模块已经不仅局限于web的形式,这对于系统后端向前端的支持需要更多的接口模块。单体应用由于面对的业务需求更为宽泛,不断扩大的需求会使得单体应用变得越来越臃肿。单体应用的问题就逐渐凸显出来,由于单体系统部署在一个进程中,如果修改了一个小的功能,为了部署上线会影响其他的功能运行。并且单体应用中...
yangty2017 发布于 1周前 阅读 421 评论 2 点赞 1

用tinyscript解一些典型算法题,小试牛刀

问题1:用1、2、2、3、4、5这六个数字,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。 原题链接:http://blog.csdn.net/zhutulang/article/details/7775644 tinyscript解法 numbers=[1,2,2,3,4,5]; numbers.permuteAll((e) -> { if(e[3]!=4&&!(abs(e.indexOf(3)-e.indexOf(5))==1)){ println(e); } }); 运行结果,篇幅原因只贴部分: [1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3] [1, 2, 5, 2, 4, 3] [1, 2, 5, 2, 3, 4] [1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3] Java解法: import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeSet; public class Sort { static TreeSet<String> ts=new TreeSet<String>(); public static void main(String[] args) { String[] d={"1","2","2","3","4","5"}; List<String> s=new A...
悠悠然然 发布于 2周前 阅读 1291 评论 13 点赞 5

git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支

1 查看远程分支 [plain] view plain copy $ git branch -a * br-2.1.2.2 master remotes/origin/HEAD -> origin/master remotes/origin/br-2.1.2.1 remotes/origin/br-2.1.2.2 remotes/origin/br-2.1.3 remotes/origin/master 2 查看本地分支 [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master 3 创建分支 [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch test shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master test 线面是把分支推到远程分支 [plain] view plain copy $ git push origin test 4 切换分支到test [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master test shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git checkout test M jingwei-server/src/main/java/com/taobao/jingwei/server/service/cmd/GetCustomerTarCmd.java M jingwei-server/src/main/java/com/taobao/jingwei/server/util/ServerUtil.java Switched to branch...
土狗 发布于 8小时前 阅读 4

java 线程篇 之CyclicBarrier、CountDownLatch、Semaphore

java 提供了很多控制线程到达某一状态导致之前阻塞线程运行的函数,这些在控制任务执行提供了很大的便利,比如在zookper 使用Semaphore实现分布式锁 1、CountDownLatch countDownLatch 提供 await(),CountDownLatch()来控制,前面我很多例子,使用这个来模拟多线程运行的,所以这里不过多介绍 2、CyclicBarrier CyclicBarrier 和 CountDownLatch差不多,都市提供一个计数器屏障,当所有线程都到达屏障时,一起执行 public class CyCliBarrierTest implements Runnable{ private static final CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() { @Override public void run() { System.out.println("所有线程到达barrier数量执行..."); } }); private CyclicBarrier barrier1; public CyCliBarrierTest(CyclicBarrier barrier1) { this.barrier1 = barrier1; } public static void main(String[] args) { for(int i = 0; i< 10; i++){ new Thread(new CyCliBarrierTest(barrier)).start(); } } @Override public void run() { ...
开源大法好啊 发布于 6小时前 阅读 3

pycharm ImportError: No module named selenium 问题解决

使用 pip install 成功安装好某一个module 之后,在 pyCharm 里导入使用 却提示类似的错误: ImportError: No module named selenium  出现此错误的原意可能是你安装了多个 python ,而pyCharm 的 python 配置路径不对导致的。比如 selenium 下载到了  python3 下,而  pyCharm 的python配置路径为 python2.7 的 ,就会出现这个错误。 修改 pyCharm 配置路径方法为: 选择 preferecence 然后看图: 选择正确的版本后, 再导入就不会再提示类似错误了 。
zh_iOS 发布于 2个月前 阅读 34

Linux基础 -- 环境变量与文件查找

1、环境变量 和多数编程语言中的设置相同,Linux中的bash脚本编程同样可以声明、使用变量。变量声明通过“declare”命令实现,赋值使用“=”(注意不能有空格),取值使用“echo $变量名”。比如: [root@izwz9gtdx1ch4f9gn56b32z etc]# declare tmp [root@izwz9gtdx1ch4f9gn56b32z etc]# tmp = pierrecai -bash: tmp: command not found [root@izwz9gtdx1ch4f9gn56b32z etc]# tmp=pierrecai [root@izwz9gtdx1ch4f9gn56b32z etc]# echo $tmp pierrecai 注意: 和Java中类似,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。 简单理解了变量的概念,就很容易理解环境变量了。环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。 通常我们会涉及到的变量类型有三种: 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量...
兴趣使然的程序员 发布于 6小时前 阅读 3

8月20日珠海源创会火热报名中,微服务架构Tars的技术揭秘

火热的八月,OSC源创会带着自由、开放、分享的开源精神,也带着满满的干货主题,邀请珠海的各位来约。
源创会

Ubuntu 下安装tomcat和配置eclipse的遇到的问题的一点心得。

tomcat,eclipse
桃核儿 发布于 6小时前 阅读 3

php7.15 Ubuntu下 Yaf 重写404

127.0.0.1 可以正常打开 index.php/index/index 127.0.0.1/index.php/index/index 出现404
石头记 发布于 2个月前 阅读 30

php版getElementById , 栈的查找匹配,html标签多层嵌套也很ok

功能: 成对匹配html标签对, 跟javascript的$.getElementById() 方法 一样.多层嵌套也很ok 不使用递归方法,而是利用栈的知识,通过位置回退方法、顺序进行匹配关闭标签。 <?php /* * 功能: 成对匹配html标签对, 跟javascript的$.getElementById() 方法 一样. * 实现方法: 成对匹配html标签对(多层嵌套也能完整匹配) ( 没有用到递归, 而是通过位置回退方法、顺序进行匹配 ) * 参数: @string: $content: 输入内容; @string: $id 标签的id; @string: $return_type 设定返回值的类型, 可选返回 'endpos'(结束位置) 或者 'substr'(截取结果). * 返回: 数字 或 字符串 , 取决于 $return_type的设置. * @author: 王奇疏 */ function getElementById( $content , $id , $return_type='substr' ) { // 匹配唯一标记的标签对 if ( preg_match( '@<([a-z]+)[^>]*id=[\"\']?'.$id.'[\"\']?[^>]*>@i' , $content , $res ) ){ $start = $next_pos = strpos( $content , $res[0] ); ++$next_pos; $start_tag = '<'.$res[1]; // 开始标签 $end_tag = '</'.$res[1].'>'; // 结束标签 $i = 1; $j = 0; ...
Mc老刘 发布于 2个月前 阅读 14

Spring整合Ehcache管理缓存

前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存。 Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。 本文先通过Ehcache独立应用的范例来介绍它的基本使用方法,然后再介绍与Spring整合的方法。 概述 Ehcache是什么? EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。它是Hibernate中的默认缓存框架。 Ehcache已经发布了3.1版本。但是本文的讲解基于2.10.2版本。 为什么不使用最新版呢?因为Spring4还不能直接整合Ehcache 3.x。虽然可以通过JCache间接整合,Ehcache也支持JCache,但是个人觉得不是很方便。 安装 Ehcache 如果你的项目使用maven管理,添加以下依赖到你的pom.xml中。 <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.2</version> <type>pom</type> </dependency> 如果你的项目不使用maven管理,请在 Ehcache官网下载地址 下载jar包。 Spring 如果你的项目使用maven管理,添加以下依赖到你的pom.xml中。 spring-context-support这个jar包中含有Spring对于缓存功...
郑加威 发布于 2个月前 阅读 16

ElasticSearch:桶过滤聚合(Bucket Selector Aggregation)

这个聚合使用于做分桶后的过滤的,父聚合传下来的参数需要为数值型,聚合中的script需要返回一个布尔型的结果 # 语法 ``` { "bucket_selector": { "buckets_path": { "my_var1": "the_sum", "my_var2": "the_value_count" }, "script": "params.my_var1 > params.my_var2" } } ``` # 参数 参数|描述|是否必填|默认值 ----|----|---|---| script|过滤条件|是| buckets_path|上层聚合的变量|是| gap_policy|当出现间隔时候的处理方式|否|skip #示例 返回按月聚合后销售额大于400的结果 ``` POST /sales/_search { "size": 0, "aggs" : { "sales_per_month" : { "date_histogram" : { "field" : "date", "interval" : "month" }, "aggs": { "total_sales": { "sum": { "field": "price" } }, "sales_bucket_filter": { "bucket_selector": { "buckets_path": { "totalSales": "total_sales" }, "script": "params.totalSales > 200" } } } } } } ``` 返回结果 ``` { "took": 11, "timed_out": false, "_shards": ..., "hits": ..., "aggregations": { "sales_per_month": { "buckets": [ { "key_as_string": "2015/01/01 00:00:00", "key": 1420070400000, "doc_count": 3, "...
小埋酱 发布于 3个月前 阅读 96

J2Cache实现分析之缓存过期

今天写一下两级缓存具体的实现 关于两级缓存的说明 两级缓存的概念很容易理解了,也是分布式环境下效率和正确性权衡后的结果。 考虑一下如果自己实现两级缓存的话需要如何实现? 关于两级缓存实现逻辑在上文中已经给出,下面就缓存更新等核心代码分析(基于redis) 为便于说明我假设存在三台机器分别为A,B,C 上运行业务系统 R为远程Redis服务器(对外表现一个,可以做数据分片) 当系统启动时,二级缓存初始时,默认起一个线程订阅redis指定channel /** * 初始化缓存通道并连接 * * @param name : 缓存实例名称 */ private RedisCacheChannel(String name) throws CacheException { this.name = name; try { long ct = System.currentTimeMillis(); CacheManager.initCacheProvider(this); redisCacheProxy = new RedisCacheProvider().getResource(); thread_subscribe = new Thread(new Runnable() { @Override public void run() { redisCacheProxy.subscribe(RedisCacheChannel.this, SafeEncoder.encode(channel)); } }); thread_subscribe.sta...
Mr_Qi 发布于 2个月前 阅读 21

二维码扫描登录实现

呵呵,不用二维码怎么算移动互联网公司呢? 下面介绍一个简单的二维码扫描登录的实现   首先定义扫描实体对象 package com.air.tqb.vo.scan; import com.air.tqb.common.AppConstant; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; public class ScanVo implements Serializable { private static final long serialVersionUID = -6258229710519417159L; private String uuid; private String deviceModel; private String platform; private String appVersion; @NotNull @Size(max = AppConstant.DEFAULT_QR_LENGTH,min = AppConstant.DEFAULT_QR_LENGTH) private String scanStr; private Integer scanType; private Long scanTime; private String remark; private String remoteIp; private String netWork; private String netInfo; private String udf1; private Integer udf2; private Double udf3; private Boolean udf4; public String getUuid() { return uuid; } ...
Mr_Qi 发布于 7天前 阅读 24

记一个hystrix异常

##序 在进行压测的时候,出现了异常:"could not be queued for execution and no fallback available."以及"Rejected command because thread-pool queueSize is at rejection threshold" ##hystrix异常 ``` com.netflix.hystrix.exception.HystrixRuntimeException: xxx#xxx(String,String) could not be queued for execution and no fallback available. at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:805) at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:790) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1451) at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractComma...
go4it 发布于 2个月前 阅读 34

Excel导出改善

和上篇描述类似Excel导入改善 我们继续使用easypoi作为导出的方式。 以工单导出为例 public class TsMaintainVO extends TsMaintain implements java.io.Serializable{ private static final long serialVersionUID=2003L; /** * 客户姓名,工单详情显示 */ @Excel(name = "客户姓名",width = AppConstant.CELL_WIDTH,orderNum="30") private String naCustomer; /** * 客户手机号,工单详情显示 */ @Excel(name = "客户手机号",width = AppConstant.CELL_WIDTH,orderNum="40") private String cellPhone; /** * 车牌号前缀,一般为省份简称,工单详情显示,和{@link #carNo carNo}一起组成车牌 */ private String carPrefix; /** * 车牌号,一般为数字和字母的组合,工单详情显示,和{@link #carPrefix carPrefix}一起组成车牌 */ @Excel(name = "车牌号",width = AppConstant.CELL_WIDTH,orderNum="70") private String carNo; /** * 车牌号整体 = carPrefix + carNo */ private String carNoWhole; /** * 车辆VIN码,工单详情显示 */ private String vin; ...
Mr_Qi 发布于 5天前 阅读 12

zookeeper - curator的监听事件

curator-recipes模块提供了zookeeper的一些典型应用场景的使用参考。在curator中,事件监听的支持由curator-recipes模块提供。下面将对这些监听器进行介绍。 # 监听客户端连接状态 Curator客户端与zookeeper连接的过程其实是一个异步过程,Curator为我们提供了一个监听器监听连接的状态,根据连接的状态做相应的处理。 ``` private CountDownLatch countDownLatch = new CountDownLatch(1); @Test public void testClientConnStateListener() throws InterruptedException { int retryIntervalMs = 1000; RetryPolicy retryPolicy = new RetryForever(retryIntervalMs); CuratorFramework testConnStateListenerClient = CuratorFrameworkFactory.builder() .connectString(ZookeeperHelper.zkAddress) .sessionTimeoutMs(ZookeeperHelper.sessionTimeout) .retryPolicy(retryPolicy) .build(); //添加监听器 testConnStateListenerClient.getConnectionStateListenable().addListener(new ConnectionStateListener() { @Override public void stateChanged(CuratorFramework client, ConnectionState newState) { if (newState == ConnectionState.CONNECTED) { try { Sy...
细肉云吞 发布于 2个月前 阅读 34

python 学习笔记 - Queue & Pipes,进程间通讯

上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流。 那么如何让进程间相互说说话呢? Python为我们提供了一个函数multiprocessing.Pipe 和一个类:multiprocessing.Queue。 multiprocessing.Pipe() multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的Connection。 Python官方文档的描述: Returns a pair (conn1, conn2) of Connection objects representing the ends of a pipe. 因此, Pipe仅仅适用于只有两个进程一读一写的单双工情况,也就是说信息是只向一个方向流动。例如电视、广播,看电视的人只能看,电视台是能播送电视节目。 Pipe的读写效率要高于Queue。 进程间的Pipe基于fork机制建立。 当主进程创建Pipe的时候,Pipe的两个Connections连接的的都是主进程。 当主进程创建子进程后,Connections也被拷贝了一份。此时有了4个Connections。 此后,关闭主进程的一个Out Connection,关闭一个子进程的一个In Connection。那么就建立好了一个输入在主进程,输出在子进程的管道。 原理示意图如下:   # 示例代码 # coding=utf-8 from multiprocessing import Pipe, Process def son_process(x...
舒运 发布于 2个月前 阅读 11

fatal: unable to get credential storage lock: File exists

描述: 设置了.git/config  [credential]     helper = store   想做保存用户密码,但是提交时出现了上面的错误。   解决: 删除  C:\Users\Administrator\.git-credentials.lock 的文件 ,重新提交后成功保存用户名
Canaan_ 发布于 6小时前 阅读 1

基于t-io的httpserver雏形版已经开源

一个雏形版而已,发布一条新闻,是不是有点小题大作的味道?t-io是在4月开始开源的,之后有好些人跟我反馈很想知道t-io是如何一步一步发展起来的,现在有机会从零开始了解t-io的httpserver,所以此条新闻纯属知会型新闻。 httpserver的代码在https://git.oschina.net/tywo45/t-io的src/zoo目录,代码极少,告诉大家一个运行入口吧:demo\httpserver-1工程的org.tio.http.demo.server1.HttpServerDemo1Starter,代码导入到eclipse后,运行HttpServerDemo1Starter,之后在浏览器中敲入:http://127.0.0.1:9527,便会出现下图界面: 因为此条新闻纯属知会型新闻,审核估计也通不过,所以也不详写了,想了解更多t-io动作的朋友还是来更好用的码云上关注t-io吧----不过想把t-io用在生产环境,还是先了解一下t-io的各种正负面新闻比较妥当,以免要上了贼船。 差点忘了说,如果以前没下载过t-io的朋友,你在下载全部代码后,需要先运行一下bin/install.bat。既然是雏形版,那么功能和性能可能都不会太好,想见证从零到成熟的朋友,可以关注。  ...
talent-tan 发布于 2个月前 阅读 318 评论 8 点赞 1

MyBatis参数无法找到异常

There is no getter for property named '*' in 'class Java.lang.String'
哭哭吓唬你 发布于 6小时前 阅读 1

python linux 命令

python linux 命令
偶记 发布于 2个月前 阅读 11

CentOs7 docker 安装与基本操作

本篇介绍在 centos7 操作系统下 docker 的安装与基本操作。 安装 docker yum remove docker docker-common container-selinux docker-selinux docker-engine docker-engine-selinux && \ yum install -y yum-utils device-mapper-persistent-data lvm2 && \ yum-config-manager --enable extras && \ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \ yum makecache fast && \ yum install -y docker-ce 基本上是先删除之前安装过的 docker 模块,再安装一些必要的工具,添加 docker 的 yum 源,最后使用yum 安装 docker。 启动 docker 服务 systemctl start docker 停止 docker 服务 systemctl stop docker 查看 docker 基本信息 docker info [root@localhost ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.06.1-ce Storage Driver: overlay Backing Filesystem: xfs Supports d_type: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journal...
gaob2001 发布于 4小时前 阅读 1

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

自下向上的编写容易阅读的代码(上)

我在 [关于极简编程的思考](https://my.oschina.net/xiandafu/blog/894155) 中曾提到要编写可阅读的代码。因为代码是编写一次,阅读多次。 阅读者包括代码编写者,以及后来的维护人员。能让阅读代码更轻松,有利于增强项目或者产品的可维护性。 本博客分为上下俩部分,第一部分讲解在代码层次 编写可阅读的代码, 第二部分讲解方法,类,以及一些设计上的考虑 让代码更适合阅读。这些都是我在实际工作的一些体会以及代码审查过程中跟同事一起得出的一些经验。没有太高深的理论,适合所有人借鉴交流。 # 代码层次(上) ## if 语句保持主流程畅通 ``` if(xxx){ return false; } if(yyy){ return false; } if(zzz){ throw new Exception(); } //主逻辑代码在下面 ....... return true; ``` 使用if语句,对于不符合主逻辑的,要尽早返回,这样可以减轻代码阅读者的负担,下次再看,直接就可以从主逻辑开始。直接跳过不关心的代码块(这样代码块必然返回都是fasle) 如下是一个不好的例子 ``` if(xxx){ return false; } if(yyy){ return true; } //主逻辑代码在下面 ``` 在主逻辑前面分别返回了true 或者 false,阅读者会造成混乱,因为说明这个方法任何一处都有可能返回不同的...
闲大赋 发布于 1周前 阅读 2594 评论 35 点赞 22

从设计上规避Go语言的 interface{} == nil 判断容易出错的简单办法

Go语言的interface{} 本质上是一个结构,含有一个type字段,一个pointer字段。 很多初学者会拿一个已经在某种情况下被赋予类型的interface{}和nil比较,然后惊讶的发现两者居然不等。 其实,从设计上,我们可以很容易规避这个问题,那就是利用Go的函数多返回值特性,在一般返回值后增加一个 ok bool类型的返回值,即可。 使用的时候,只判断最后一项返回值 ok 是不是等于true即可,完美避免了陷入x可能带有类型信息的麻烦。 对此有怀疑的同学可以比较下下面两种情况: 深究起来是因为任何指针赋值给interface{}的时候,都会把interface{}的类型信息字段给填上,于是就不等于nil了。再看下面这个例子: 变量t是一个空指针,赋值给i以后,i就不等于nil了。 为了代码的清晰可读,我建议采用本文开头推荐的函数返回值设计,绕开本文所描述的陷阱。          
LinkerLin 发布于 6天前 阅读 852 评论 10

PHP实现定时任务(非linux-shell方式,与操作系统无关)

用PHP实现定时任务(非linux-shell方式,与操作系统平无关)。适用于定时精确时间不低于1秒。web服务重启、或者php重启。该定时任务不会自动重启。可以用来处理大部分定时任务的结局方案,商城定时自动收货,关闭评论,订单回滚;定时发送邮件,数据备份等
大弹簧 发布于 7天前 阅读 2429 评论 29 点赞 3

另一种JFinal读取配置文件的高效方案

本文是基于JFinal编写的一种读取配置文件的更加高效的方案。如果您没有使用JFInal,没必要阅读此篇文章,以免浪费您的时间。   使用过JFinal开发项目的朋友都知道,读取properties配置文件其实非常简单,JFinal已经提供了一个PropKit的工具类,使我们非常方便的读取到配置文件中的某个值。 在代码初始化的时候,首先初始化下Propkit,代码如下: PropKit.use("jboot.properties"); 然后在整个项目中,随便使用PropKit的get方法即可读取jboot.properties文件的任何内容,例如: String wechatAppId = PropKit.get("wechat_app_id"); 非常简洁,读取某个配置文件也就一行代码而已。   但是,但是...   在我们实际开发中,某个组件的配置,往往是由多个配置信息组成的,比如微信开发的相关配置,需要的信息可能如下: wechat.debug = false wechat.appid = xxx wechat.appsecret = xxx wechat.token = xxx wechat.partner = xxx wechat.paternerKey = xxx wechat.cert = xxx wechat.templateId = xxx 那么,如果我们在需要读取这些信息的时候,比如在拦截器里,我们可能需要编写如下的代码: String wechatAppId = PropKit.get("wechat.id"); String wechatAppSecret= Pro...
michaely 发布于 3天前 阅读 339 评论 7 点赞 4

Java架构师,大数据架构师,高并发设计模式,机器学习课程大全百度云分享

以下所有课程现在只需100元,需要的联系Q(2929608935) 第一章:java精品课程目录大全       1、亿级流量电商详情页系统的大型高并发与高可用缓存架构实战             1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟             2基于大型电商网站中的商品详情页系统贯穿的授课思路介绍7分钟             3小型电商网站的商品详情页的页面静态化架构以及其缺陷11分钟             4大型电商网站的异步多级缓存构建+nginx数据本地化动态渲染的架构9分钟             5能够支撑高并发+高可用+海量数据+备份恢复的redis的重要性5分钟             6从零开始在虚拟机中一步一步搭建一个4个节点的CentOS集群58分钟             7单机版redis的安装以及redis生产环境启动方案29分钟             8redis持久化机对于生产环境中的灾难恢复的意义12分钟             9图解分析redis的RDB和AOF两种持久化机制的工作原理25分钟             10redis的RDB和AOF两种持久化机制的优劣势对比22分钟             11redis的RDB持久化配置以及数据恢复实验16分钟             12redis的A...
Zosimer 发布于 2周前 阅读 2360 点赞 1

Spring源码-AOP(三)-Spring AOP的四种实现

There is a crack in everything, That's how the light gets in. 万物皆有裂缝,那是光照进来的地方。 -- 莱昂纳多 科恩
青离 发布于 1周前 阅读 997 评论 4

Shiro实现多域名登录界面

背景 目前开发接到需求如下,希望根据不同用户实现自定义域名登录(前台ui等需要略微区分,配色,皮肤等) 现状 目前系统中使用shiro作为授权权限框架,当用户没有登录时将会默认返回未授权页 比如  <!-- 配置shiroFilter--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="${wxb.url}"/> <property name="successUrl" value="/kzf6/page/index/index.jsp" /> <property name="unauthorizedUrl" value="/kzf6/page/error/403.jsp" /> <property name="filters"> <map> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </map> </property> <property name="filterChainDefinitions"> <value> /mlogin/login.json = anon <!-- 除了上面定义的url和资源,都需要配认证后才可以访问 --> /** = kickout,authc </value> </property> </bean> 上述配置可以导致未登录用户来自动重定向到${w...
Mr_Qi 发布于 18小时前 阅读 224 评论 2 点赞 1

java高并发锁的3种实现

java高并发锁的3种实现
正在长大的毛毛虫 发布于 18小时前 阅读 206

基于 CSP 的设计思想和 OOP 设计思想的异同

Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的角度看,CSP和OOP到底有什么区别。 下面,我们来看一个例子,如果我们有一个项目,需要做一个TCP连接中继器( 请原谅我的用词)。我们先按照OOP来设计下: 系统的结构:需要有一个客户端和一个服务器端。分两个进程分别跑在不同机器上。 系统对象关系拆分(这里有所简化,E-R图等省略):连接中继器类--系统的主类、config类--描述配置的类、connection类--每个连接一个conn类的实例、pipe类--提供一个管道,把上游的连接和下游的连接打通,把数据从A--pipe--B、encrypt工具类,提供各种加解密工具。 理清楚系统中各种对象(类)的作用关系,设计接口的细节。这里的接口,其实就是对象之间相互发送的同步阻塞的消息。 设计错误处理,日志等。 从性能方面审视整个设计,优化。 ===== 好,我们再按CSP的思路来设计下,是这么一个过程: 我们需要一个 main 协程来处理各种命令行参数的配置,收集处理配置文件; 如果是server,那么初始化server的主协程 -- tcpRemote;如果是client,则启动client的主协程 -- tcpLocal; 分...
LinkerLin 发布于 1周前 阅读 1831 评论 7 点赞 3

当 Thrift 遇到 JDK Epoll Bug

将会擦出怎样的火花呢?
輕風 发布于 1周前 阅读 1732 评论 22 点赞 6

正确Json化JFinal的Record

直接对JFinal的Record进行Json化,会出现大家不想要的结果,JFinal的作者提供了一个解决方法就是用: MixedJsonFactory.me().getJson().toJson(page),如下 Page<Record> page = srv.page(pageNumber, pageSize); HttpResponse ret = Resps.json(request, MixedJsonFactory.me().getJson().toJson(page)); 不过,对于我这种对Json作过适配的人来说,多少显得有点犯洁癖,于是配合FastJson,写了下面这个类 import java.io.IOException; import java.lang.reflect.Type; import java.util.Map; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.jfinal.plugin.activerecord.Record; /** * @author tanyaowu * 2017年8月20日 上午8:49:05 */ public class JfinalRecordSerializer implements ObjectSerializer { public static final JfinalRecordSerializer instance = new JfinalRecordSerializer(); /** * * @author tanyaowu */ public JfinalRecordSerializer() { } /** * @param serializer * @param object * @param fieldName * @param fieldType * @...
talent-tan 发布于 2天前 阅读 181 评论 3 点赞 2

加速前后端并行开发,JApiDocs 可以帮到你

JApiDocs 作为一个衔接前后端开发的的工具,尽可能把重复劳动都自动化了,实现了代码即文档,持续集成接口测试的小目标,非常优雅的解决在前后端并行开发碰到的一些问题。
叶大侠 发布于 4天前 阅读 395 评论 2

Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】

> 本篇作为《Spring Cloud微服务实战》一书关于Spring Cloud Zuul网关在Dalston版本对异常处理的补充。没有看过本书的读书也不要紧,可以先阅读我之前的两篇博文:[《Spring Cloud实战小贴士:Zuul统一异常处理(一)》](http://blog.didispace.com/spring-cloud-zuul-exception-1/)和[《Spring Cloud实战小贴士:Zuul统一异常处理(二)》](http://blog.didispace.com/spring-cloud-zuul-exception-2/),这两篇文章都详细介绍和分析了Spring Cloud Zuul在过滤器设计中对异常处理的不足。同时,在这两篇文章中,也针对不足之处做了相应的解决方案。不过,这些方案都是基于Brixton版本所做的,在最新的Dalston版本中,Spring Cloud Zuul做了一些优化,所以我们不再需要做这些扩展就已经能够正确的处理异常信息了。那么,在Dalston版中,Spring Cloud Zuul中做了怎么样的修改以达到之前我们自己扩展的效果呢? ## 过滤器类型的变更 读者是否还记得我们之前分析了Spring Cloud Zuul自带的核心过滤器有哪些呢?我们先根据下图回忆一下: ![](http://blog.didispace.com/content/images/posts/spring-cloud-zuul-exception-3-1.png) 这次主要将`SendErrorFilter`过滤器的类型从`...
程序猿DD 发布于 1周前 阅读 686 评论 1

知名公司拿我的开源软件( XXL-JOB)申请国家知识专利,我该怎么办?

## 最新进展:https://my.oschina.net/javayou/blog/918941 >关于这件事情我们的本意和唯一诉求是 “就事论事,撤销专利”,无意伤害任何人。为了防止事情被误导和进一步扩大,我隐去了发明人、代理人和申请人的相关信息,在此希望大家不要转发和恶意评论此事,理智对待切勿网络暴力。我们的最终目标是要解决问题,希望大家可以提供一个协商解决的环境。 ## 请大家理智对待,不要发表过激言论 感谢各位的关注,相关事情已经委托"开源中国"处理,正在和对方沟通中。我们的诉求只有两点: - 1、对方撤销专利。(专利发明人已积极道歉并,且勿网络暴力); - 2、对方正面声明。(给关注的朋友一个交代); ## 声明 - 1、XXL-JOB自始至终是一款开源软件,永远开源免费,社区成员将会持续提供技术支持。 - 2、XXL-JOB一直以来是GPL协议开源,目的是为了禁止各种定制版本变相收费,我们承诺产品免费。 - 3、希望冒名申请国家发明专利的公司和个人正视问题:**尽快撤销申请专利,并且公开声明**。 - 4、请大家就事论事,不要变成网络暴力,也不要偏离主题啊。 >抛开冒名申请国家发明专利不谈,在此我有几个问题: - 开源软件是否能够申请国家知识专利? - 开源软件如何进行保护,开...
许雪里 发布于 2个月前 阅读 79321 评论 423 点赞 108 打赏 4

JMS实现参数的集中式管理

前言 上一篇文件Zookeeper实现参数的集中式管理介绍了使用Zookeeper对节点的监听通知机制简单实现了对参数的集中式管理,其实JMS的发布订阅机制也能实现类似的功能,集群节点通过订阅指定的节点,同时使用jms对消息的过滤器功能,实现对指定参数的更新,本文将介绍通过JMS实现简单的参数集中式管理。 Maven引入 Spring相关的jar引入参考上一篇文章 <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.10.0</version> </dependency> 目标 1.可以同时配置监听多个节点如/app1,/app2; 2.希望只需要配置如/app1,就能够监听其子节点如/app1/modual1以及子节点的子节点如/app1/modual1/xxx/…; 3.服务器启动能获取当前指定父节点下的所有子节点数据; 4.在添加节点或者在更新节点数据的时候能够动态通知,这样代码中就能够实时获取最新的数据; 5.spring配置中可以从Zookeeper中读取参数进行初始化。 虽然在实现的方式上有点区别,但是最终达成的目标是一致的,同样列出了这5条目...
ksfzhaohui 发布于 1周前 阅读 310

Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator

The best way to predict the future is to invent it. 预测未来的最好方法就是创造未来。 -- 沃尔特·艾萨克森 《乔布斯传》
青离 发布于 17小时前 阅读 121

自己手动实现一个简单的线程池

发现自己一直没有手动实现过一个简单的线程池,所以无聊自己实现一个玩玩,非常简单的一个线程池,各位看官看看,笑笑就好,欢迎拍砖...
贺小五 发布于 3天前 阅读 92

Restful API利器——RestPack项目教程

## 目录 * 项目背景 * RestPack 简介 * 源码下载 * 软件版本 * 配置 terran4j 的 Maven 仓库 * 引入 RestPack 依赖 * 启用 RestPack * @RestPackController 注解 * RestPack 异常处理 * 日志输出 * 资源分享与技术交流 ## 项目背景 在互联网、移动互联网、车联网、物联网繁荣的今天,各种客户端设备层出不穷,为了能用同一套服务端程序处理各种客户端的访问,[ HTTP Restful API ](http://www.ruanyifeng.com/blog/2014/05/restful_api.html) 变得流行起来。 但是客户端与服务端交互时,往往会有一些通用的需求,比如: * 服务端在处理一个 API 请求时,如果出异常了,总是希望在请求的返回结果中给出一个明确的错误码,客户端可以根据错误码作进一步的处理。 * 为了方便排查问题,总是希望对于每个请求,服务端会返回一个 requestId,后台可以将这个请求产生的日志与这个 requestId 相关联。 这样一旦前后端联调时发现了问题,前端工程师只要给出 requestId ,后台工程师就可以拿着这个 requestId 快速找出相关日志,方便分析排查问题。 ...... 为了满足这些非功能性需求,笔者总结了之前很多项目的开发经验,归纳出一套统一的数据返回格式,如下(分成功和失败两种情况)...
terran4j 发布于 4天前 阅读 297 评论 5

如何实施开源协议,以及如何遵守开源协议的要求

网上有很多开源协议的介绍,但是很少有说明如何在你自己开发的软件中使用开源协议,保护自己的代码;以及当你使用别人开源项目时,如何遵守开源协议里面约定的行为。文本从github上找了些项目举例描述下这2个问题。至于各个协议的具体说明网上一搜一大堆,本文不再描述。 如何定义自己软件的开源协议 假如你要开源自己写的一个软件,那你需要进行2步来实施开源协议: 第1步: 在项目的根目录放置一个LICENSE或者COPYING文件,这个文件里面是你所使用的开源协议的具体细则,比如你用的是MIT License协议,你只需要到网上拷贝一个MIT License协议正文进来就可以了,比如vsa这个项目,使用的是Apache License 2.0开源协议,协议的正文在这里。 第2步: .在你项目的每个源文件中加入版权声明,比如vsa项目中的这个文件加入了如下的版权声明。 #!/usr/bin/env python # vim: tabstop=4 shiftwidth=4 softtabstop=4 # # Copyright 2013 Mellanox Technologies, Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache...
二两棉 发布于 1周前 阅读 241

Laravel 与 Alpaca-Spa 实现前后分离开发后台管理系统

Laravel 与 Alpaca-Spa前后端分离开发的一个后台管理系统的DEMO。Laravel用来实现后端功能,Alpaca-Spa用来实现前端功能,前后端之间通过Json交换数据。
大弹簧 发布于 6天前 阅读 298 点赞 1

CentOs7 docker 安装与基本操作

本篇介绍在 centos7 操作系统下 docker 的安装与基本操作。 安装 docker yum remove docker docker-common container-selinux docker-selinux docker-engine docker-engine-selinux && \ yum install -y yum-utils device-mapper-persistent-data lvm2 && \ yum-config-manager --enable extras && \ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \ yum makecache fast && \ yum install -y docker-ce 基本上是先删除之前安装过的 docker 模块,再安装一些必要的工具,添加 docker 的 yum 源,最后使用yum 安装 docker。 启动 docker 服务 systemctl start docker 停止 docker 服务 systemctl stop docker 查看 docker 基本信息 docker info [root@localhost ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.06.1-ce Storage Driver: overlay Backing Filesystem: xfs Supports d_type: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journal...
gaob2001 发布于 4小时前 阅读 1

MyBatis参数无法找到异常

There is no getter for property named '*' in 'class Java.lang.String'
哭哭吓唬你 发布于 6小时前 阅读 1

73款阿里巴巴开源软件详解!

详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
阿里巴巴

Ubuntu 下安装tomcat和配置eclipse的遇到的问题的一点心得。

tomcat,eclipse
桃核儿 发布于 6小时前 阅读 3

Linux基础 -- 环境变量与文件查找

1、环境变量 和多数编程语言中的设置相同,Linux中的bash脚本编程同样可以声明、使用变量。变量声明通过“declare”命令实现,赋值使用“=”(注意不能有空格),取值使用“echo $变量名”。比如: [root@izwz9gtdx1ch4f9gn56b32z etc]# declare tmp [root@izwz9gtdx1ch4f9gn56b32z etc]# tmp = pierrecai -bash: tmp: command not found [root@izwz9gtdx1ch4f9gn56b32z etc]# tmp=pierrecai [root@izwz9gtdx1ch4f9gn56b32z etc]# echo $tmp pierrecai 注意: 和Java中类似,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。 简单理解了变量的概念,就很容易理解环境变量了。环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。 通常我们会涉及到的变量类型有三种: 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量...
兴趣使然的程序员 发布于 6小时前 阅读 3

java 线程篇 之CyclicBarrier、CountDownLatch、Semaphore

java 提供了很多控制线程到达某一状态导致之前阻塞线程运行的函数,这些在控制任务执行提供了很大的便利,比如在zookper 使用Semaphore实现分布式锁 1、CountDownLatch countDownLatch 提供 await(),CountDownLatch()来控制,前面我很多例子,使用这个来模拟多线程运行的,所以这里不过多介绍 2、CyclicBarrier CyclicBarrier 和 CountDownLatch差不多,都市提供一个计数器屏障,当所有线程都到达屏障时,一起执行 public class CyCliBarrierTest implements Runnable{ private static final CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() { @Override public void run() { System.out.println("所有线程到达barrier数量执行..."); } }); private CyclicBarrier barrier1; public CyCliBarrierTest(CyclicBarrier barrier1) { this.barrier1 = barrier1; } public static void main(String[] args) { for(int i = 0; i< 10; i++){ new Thread(new CyCliBarrierTest(barrier)).start(); } } @Override public void run() { ...
开源大法好啊 发布于 6小时前 阅读 3

fatal: unable to get credential storage lock: File exists

描述: 设置了.git/config  [credential]     helper = store   想做保存用户密码,但是提交时出现了上面的错误。   解决: 删除  C:\Users\Administrator\.git-credentials.lock 的文件 ,重新提交后成功保存用户名
Canaan_ 发布于 6小时前 阅读 1

堆转储分析与实现

1、命令行执行java程序: java -Xmx40m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\dump cn.com.paic.TestMem 2、eclipse执行程序配置参数: 3、weblogic配置参数,在startWeblogic.cmd文件中设置如: set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS% -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\dump 深入分析: http://blog.csdn.net/yuebinghaoyuan/article/details/38367697
剑尊 发布于 6小时前 阅读 2

授权基础知识

每日一博。
我爱程序yuan 发布于 6小时前 阅读 2

操作系统常见概念

本文是对操作系统中常见的底层术语进行简单的解释说明,明确一些基本概念。
蔡佳娃 发布于 7小时前 阅读 5

I/O会一直占用CPU吗?

阻塞io情况下,比如磁盘io,accept ,read,recv,write等调用导致进程或者线程阻塞,这时候线程/进程 会占用cpu吗?比如连接mysql,执行一条需要执行很长的sql语句,recv调用的时候阻塞了,这个时候会不会大量占用cpu时间?磁盘io是什么操作,比如linux调用cp拷贝大文件的时候会大量占用cpu吗?
正在长大的毛毛虫 发布于 8小时前 阅读 4

git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支

1 查看远程分支 [plain] view plain copy $ git branch -a * br-2.1.2.2 master remotes/origin/HEAD -> origin/master remotes/origin/br-2.1.2.1 remotes/origin/br-2.1.2.2 remotes/origin/br-2.1.3 remotes/origin/master 2 查看本地分支 [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master 3 创建分支 [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch test shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master test 线面是把分支推到远程分支 [plain] view plain copy $ git push origin test 4 切换分支到test [plain] view plain copy shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch * br-2.1.2.2 master test shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git checkout test M jingwei-server/src/main/java/com/taobao/jingwei/server/service/cmd/GetCustomerTarCmd.java M jingwei-server/src/main/java/com/taobao/jingwei/server/util/ServerUtil.java Switched to branch...
土狗 发布于 8小时前 阅读 4

普通项目dubbo服务化改造+provider构建为jar包运行

普通项目dubbo服务化改造+provider构建为jar包运行
正在长大的毛毛虫 发布于 9小时前

dubbo的文件上传

我们将customer和provider分开部署了,这次主要记录文件在customer和provider之间的传输. 如果文件直接在customer中进行保存,不需要传递到provider,则和dubbo就没有关系了. 如果需要传递,如果是使用dubbo协议的话,是不支持 file,inputStream 这种文件,流的传输的. dubbo中customer和provider之间的通信协议支持很多种,详见点击打开官方文档
正在长大的毛毛虫 发布于 9小时前

知识共享协议与版权声明

[1] 你知道什么是知识共享协议吗?http://blog.sina.com.cn/s/blog_8d98e8070102ww21.html [2] “知识共享”(CC协议)简单介绍, https://zhuanlan.zhihu.com/p/20641764 [3] CC协议使用FAQ, https://zhuanlan.zhihu.com/p/22320679 [4] 禅道开源授权协议ZPL协议,http://zpl.pub/page/zplv12.html [5] 如何正确认识版权声明标记?http://blog.sina.com.cn/s/blog_8d98e8070102ww20.html “知识共享”是 Creative Commons 在中国大陆地区的通用译名,一般简称为 CC。CC 既是该国际组织的名称缩写,也是一种版权授权协议的统称。在目前网络上流行的授权许可证主要有 BSD 许可证及其系列、GNU 系列、CopyLeft 系列(事实上这个概念包括前两者)以及 CC 系列。其中,BSD 和 GNU 许可证更广泛应用于软件及其源码方面,而CC系列协议主要用于文字或艺术类的创作内容上。 若要选择 CC 协议,请回答以下两个问题: 1、是否允许依据你的创作进行的再创作被分享? A、 是 B、否 C、是,只要在相同的授权条件下。 2、 是否允许你的创作应用于商业用途? A、 是 B、否 根据回答你可以使用的协议如下: AA:署名 BY AB:署名-非商业性使用 BY-NC BA:署名-禁止演绎 BY-ND BB:署名-非...
一配 发布于 10小时前 阅读 3

IO密集型任务

IO密集型任务
正在长大的毛毛虫 发布于 10小时前 阅读 1

计算密集型任务

计算密集型任务
正在长大的毛毛虫 发布于 10小时前

为什么我们要考虑并发

为什么我们要考虑并发
正在长大的毛毛虫 发布于 10小时前 阅读 2

spring - 6 AOP - AspectJ

1.概念 对于AOP这种编程思想,很多框架都进行了实现。Spring就 是其中之一,可以完成面向切面编程。然而,AspectJ也实现了AOP 的功能,且其实现方式更为简捷,使用更为方便,而且还支持注解 式开发。所以,Spring又将AspectJ的对于AOP的实现也引入到了自 己的框架中。 在Spring中使用AOP开发时,一般使用AspectJ的实现方式。 AspectJ的通知类型 AspectJ中常用的通知有五种类型: 前置通知 后置通知 环绕通知 异常通知 最终通知:无论程序执行是否正常,该通知都会执 行。类似于try..catch中finally代码块。 2.AspectJ的切入点表达式 切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达 式中明显就是方法的签名。注意,表达式中加[ ]的部分表示可省略部分, 各部分间用空格分开。在其中可以使用以下符号: AspectJ的切入点表达式 举例: execution(public * *(..)) 指定切入点为:任意公共方法。 execution(* set *(..)) 指定切入点为:任何一个以“set”开始的方法。 execution(* com.xyz.service.*.*(..)) 指定切入点为:定义在service包里的任意类的任意方法。 execution(* com.xyz.service..*.*(..)) 指定切入点为:定义在service包或者子包里的任意类的...
南久久 发布于 11小时前 阅读 5

Java注解秘籍

1. ``` @WebServlet(name = "ReadServlet",urlPatterns={"/hello"}) //这样写就不用再web.xml那里配置servlet访问路径了 ```
LM加强 发布于 11小时前 阅读 6

二叉树层次遍历的问题

二叉树层次遍历的问题: 两种方法:     方法1. 最普通,Non-recursive: BFS, queue, 用个queue.size()来end for loop:换行。        或者用两个queue. 当常规queue empty,把backup queue贴上去。   方法2. Recursive with dfs:   每个level都应该有个ArrayList. 那么用一个int level来查看:是否每一层都有了相应的ArrayList。   如果没有,就加上一层。   之后每次都通过DFS在相应的level上面加数字。     Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).         Example   Given binary tree {3,9,20,#,#,15,7},       3   / \   9 20   / \   15 7           return its level order traversal as:       [   [3],   [9,20],   [15,7]   ]   Challenge   Challenge 1: Using only 1 queue to implement it.       Challenge 2: Use DFS algorithm to do it.         //树的结构定义   public class TreeNode {     public int val;     public TreeNode left, right;       public TreeNode(int data) {       this.val = d...
writeademo 发布于 11小时前 阅读 4

PHP实现定时任务(非linux-shell方式,与操作系统无关)

用PHP实现定时任务(非linux-shell方式,与操作系统平无关)。适用于定时精确时间不低于1秒。web服务重启、或者php重启。该定时任务不会自动重启。可以用来处理大部分定时任务的结局方案,商城定时自动收货,关闭评论,订单回滚;定时发送邮件,数据备份等
大弹簧 发布于 7天前 阅读 2429 评论 29 点赞 3

自下向上的编写容易阅读的代码(上)

我在 [关于极简编程的思考](https://my.oschina.net/xiandafu/blog/894155) 中曾提到要编写可阅读的代码。因为代码是编写一次,阅读多次。 阅读者包括代码编写者,以及后来的维护人员。能让阅读代码更轻松,有利于增强项目或者产品的可维护性。 本博客分为上下俩部分,第一部分讲解在代码层次 编写可阅读的代码, 第二部分讲解方法,类,以及一些设计上的考虑 让代码更适合阅读。这些都是我在实际工作的一些体会以及代码审查过程中跟同事一起得出的一些经验。没有太高深的理论,适合所有人借鉴交流。 # 代码层次(上) ## if 语句保持主流程畅通 ``` if(xxx){ return false; } if(yyy){ return false; } if(zzz){ throw new Exception(); } //主逻辑代码在下面 ....... return true; ``` 使用if语句,对于不符合主逻辑的,要尽早返回,这样可以减轻代码阅读者的负担,下次再看,直接就可以从主逻辑开始。直接跳过不关心的代码块(这样代码块必然返回都是fasle) 如下是一个不好的例子 ``` if(xxx){ return false; } if(yyy){ return true; } //主逻辑代码在下面 ``` 在主逻辑前面分别返回了true 或者 false,阅读者会造成混乱,因为说明这个方法任何一处都有可能返回不同的...
闲大赋 发布于 1周前 阅读 2594 评论 35 点赞 22

73款阿里巴巴开源软件详解!

详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
阿里巴巴

基于 CSP 的设计思想和 OOP 设计思想的异同

Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的角度看,CSP和OOP到底有什么区别。 下面,我们来看一个例子,如果我们有一个项目,需要做一个TCP连接中继器( 请原谅我的用词)。我们先按照OOP来设计下: 系统的结构:需要有一个客户端和一个服务器端。分两个进程分别跑在不同机器上。 系统对象关系拆分(这里有所简化,E-R图等省略):连接中继器类--系统的主类、config类--描述配置的类、connection类--每个连接一个conn类的实例、pipe类--提供一个管道,把上游的连接和下游的连接打通,把数据从A--pipe--B、encrypt工具类,提供各种加解密工具。 理清楚系统中各种对象(类)的作用关系,设计接口的细节。这里的接口,其实就是对象之间相互发送的同步阻塞的消息。 设计错误处理,日志等。 从性能方面审视整个设计,优化。 ===== 好,我们再按CSP的思路来设计下,是这么一个过程: 我们需要一个 main 协程来处理各种命令行参数的配置,收集处理配置文件; 如果是server,那么初始化server的主协程 -- tcpRemote;如果是client,则启动client的主协程 -- tcpLocal; 分...
LinkerLin 发布于 1周前 阅读 1831 评论 7 点赞 3

当 Thrift 遇到 JDK Epoll Bug

将会擦出怎样的火花呢?
輕風 发布于 1周前 阅读 1732 评论 22 点赞 6

数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析

![](https://www.yunai.me/images/common/wechat_mp_2017_07_31.jpg) > 🙂🙂🙂关注**微信公众号:[【芋艿的后端小屋】](http://www.yunai.me/images/common/wechat_mp.jpeg)**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列表 > 2. RocketMQ / MyCAT / Sharding-JDBC **中文注释源码 GitHub 地址** > 3. 您对于源码的疑问每条留言**都**将得到**认真**回复。**甚至不知道如何读源码也可以请教噢**。 > 4. **新的**源码解析文章**实时**收到通知。**每周更新一篇左右**。 > 5. **认真的**源码交流微信群。 ------- - [1. 概述](#) - [2. SQLParsingEngine](#) - [3. SQLParser SQL解析器](#) - [3.1 AbstractParser](#) - [3.2 SQLParser](#) - [3.2.1 #parseExpression() 和 SQLExpression](#) - [3.2.2 #parseAlias()](#) - [3.2.3 #parseSingleTable()](#) - [3.2.4 #skipJoin()](#) - [3.2.5 #parseWhere()](#) - [4. StatementParser SQL语句解析器](#) - [4.1 StatementParser](#) - [4.2 Statement](#) - [5. 彩蛋](#) ------- # 1. 概述 上篇文章[《词法解析》](http://www.yunai.me/Sharding-JDBC/sql-parse-1/)分享了**词法解析器...
芋艿V 发布于 3周前 阅读 2473 评论 19 点赞 7

RSA公私钥快速生成和RSA证书快速创建"利器"

RSA公私钥生成,RSA pkcs12证书创建, rsa密钥对
钟声已经敲响 发布于 4周前 阅读 1386 评论 5 点赞 3

SpringBoot入门——局部与全局的异常处理

SpringBoot入门——局部与全局的异常处理 1、构建测试代码 (1)、新建MAVEN项目 打开IDE—新建Maven项目—构建一个简单Maven项目 (2)、编写pom.xml引入包 编写pom配置引入jar包 注:引入完毕后可能项目会报红叉,更新maven即可 <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"> <modelVersion>4.0.0</modelVersion> <groupId>com.springboot</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- 引入web相关包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</...
DLQ丁 发布于 4周前 阅读 4349 评论 22 点赞 15

从字节码和JVM的角度解析Java核心类String的不可变特性

从字节码和JVM的角度解析Java核心类String的不可变特性
kailuncen 发布于 1个月前 阅读 3072 评论 36 点赞 22

Flume + Solr + log4j搭建web日志采集系统

这篇博客是学习Hadoop生态系统的第一篇博客,上一篇,搭建好了集群,这篇会做一个 start up,日志采集与搜索。
OrangeJoke 发布于 1个月前 阅读 4097 评论 4 点赞 1

spring-boot & zxing 搭建二维码服务

搭建一个二维码的生成 & 解析服务, 使用java web对外提供http调用,返回base64格式的二维码图片
六月依 发布于 1个月前 阅读 3080 评论 9 点赞 7

spring AOP是什么?你都拿它做什么?

由浅入深手把手带你搞定spring Aop。
liugh_develop 发布于 1个月前 阅读 7709 评论 33 点赞 30 打赏 5

穷人也能拥抱‘持续集成’与‘持续交付’

首先说一说为什么说穷人,笔者自己买了一台阿里云的ECS服务器,最开始是一台便宜的单核1G的服务器(其实前面还有更苦的,一把辛酸泪就不说了),苦了它了,里面跑了一堆服务,诸如Tomcat、Nginx、MySQL、Redis、RabbitMQ、JVM等等,发现本来就很吃力,后来又想搞个持续集成部署个Jenkins,结果搞挂了几次服务器,每次内存飙到95%(要知道Gitlab要求机器最好为4G),只能重启服务器了。又没钱升级配置,只能看看有什么服务比较好。
橙子先生 发布于 1个月前 阅读 3292 评论 20 点赞 2 打赏 1

深入JVM虚拟机之全书脑图

有的地方实在无法展开,文件太大了,压缩了70%才能上传
RippleChan 发布于 2个月前 阅读 6914 评论 72 点赞 42

SpringBoot集成Redis来实现缓存技术方案

概述 在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。 Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,Redis 的优势包括它的速度、支持丰富的数据类型、操作原子性,以及它的通用性。 案例整合 本案例是在之前一篇SpringBoot + Mybatis + RESTful的基础上来集成Redis的,所以大家如有什么不明白的地方可以前往https://my.oschina.net/feinik/blog/879266,由于篇幅原因这里不一一贴出所有的代码,具体完整案例代码可以看这里:https://github.com/AIFEINIK/SpringBoot-Learn/tree/master/spring-boot-redis2,关于Redis如何安装可自行google。 1、在Maven pom.xml文件中加入Redis包 <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>${boot.version}</version> </dependency> 2、SpringBoot配置文件中配置Redis连接(YAML方式配置) spring: application: ...
FEINIK 发布于 2个月前 阅读 4691 评论 30 点赞 11

全栈开发——动手打造属于自己的直播间(Vue+SpringBoot+Nginx)

#前言 大学的学习时光临近尾声,感叹时光匆匆,三年一晃而过。同学们都忙着找工作,我也在这里抛一份[简历](http://139.199.82.213:8080/LiveDemo/resume)吧,欢迎各位老板和猎手诚邀。我们进入正题。直播行业是当前火热的行业,谁都想从中分得一杯羹,直播养活了一大批人,一个平台主播粗略估计就有几千号人,但是实时在线观看量有的居然到了惊人的百万级别,特别是游戏主播,可想而知,直播间是一个磁铁式的广告传播媒介,也难怪这么多巨头公司都抢着做直播。我不太清楚直播行业技术有多深,毕竟自己没做过,但是咱们可以自己实现一个满足几百号人同时观看的直播间呀。 ---------- # 最终成果 * [演示地址(电脑端与移动端效果不同哦)](http://139.199.82.213:8080/LiveDemo/live_room) * [服务端项目地址](https://github.com/jack-hoo/LiveRoomDemo_Server) * [客户端项目地址](https://github.com/jack-hoo/LiveRoomDemo_Client) > 手机端效果 ![动图](http://www.veton.cc/LiveDemo/dongtai1.gif ) 这个场景很熟悉吧~~ 通过obs推流软件来推流。 ![图片描述](https://static.oschina.net/uploads/img/201706/23132352_igQv.png "在这里输入图片标题")![] 户外直播,通过...
jack-hoo 发布于 2个月前 阅读 7896 评论 68 点赞 38 打赏 1

深入浅出 spring-data-elasticsearch - 实战案例详解(四)

『  热烈的爱情到订婚早已是定点,婚一结一切了结。现在订了婚,彼此间还留着情感发展的余地,这是桩好事。- 《我们仨》 』 「系列文章」 深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一) 深入浅出 spring-data-elasticsearch - 概述(二) 深入浅出 spring-data-elasticsearch - 基本案例详解(三) 深入浅出 spring-data-elasticsearch - 实战案例详解(四) 深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)(拼命编写ing) 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2 本文提纲 一、搜索实战场景需求 二、运行 spring-data-elasticsearch-query 工程 三、spring-data-elasticsearch-query 工程代码详解   一、搜索实战场景需求 搜索的场景会很多,常用的搜索场景,需要搜索的字段很多,但每个字段匹配到后所占的权重又不同。比如电商网站的搜索,搜到商品名称和商品描述,自然商品名称的权重远远大于商品描述。而且单词匹配肯定不如短语匹配。这样就出现了新的需求,如何确定这些短语,即自然分词。那就利用分词器,即可得到所需要的短语,然后进行...
泥沙砖瓦浆木匠 发布于 2个月前 阅读 1747 评论 4 点赞 1

深入浅出 spring-data-elasticsearch - 基本案例详解(三)

『  风云说:能分享自己职位的知识的领导是个好领导。 』   欢迎来 Spring For All , 和我探讨 Spring 相关的分享。 http://spring4all.com   运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2   本文提纲 一、spring-data-elasticsearch-crud 的工程介绍 二、运行 spring-data-elasticsearch-crud 工程 三、spring-data-elasticsearch-crud 工程代码详解 一、spring-data-elasticsearch-crud 的工程介绍 spring-data-elasticsearch-crud 的工程,介绍 Spring Data Elasticsearch 简单的 ES 操作。Spring Data Elasticsearch 可以跟 JPA 进行类比。其使用方法也很简单。 二、运行 spring-data-elasticsearch-crud 工程 注意的是这里使用的是 ElasticSearch 2.3.2。是因为版本对应关系 https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix;  Spring Boot Version (x)    Spring Data Elasticsearch Version (y)    Elasticsearch Version (z) x <= 1.3.5    y <= 1.3.4    z <= 1.7.2* x >= 1.4.x    2....
泥沙砖瓦浆木匠 发布于 2个月前 阅读 2538 评论 5 点赞 1

Redis 通信协议-了解 Redis 客户端实现原理

# 简介 几乎所有的主流编程语言都有Redis的客户端(http://redis.io/clients),不考虑Redis非常流行的原因,如果站在技术的角度看原因还有两个: 1. 客户端与服务端之间的通信协议是在 **TCP 协议**之上构建的。 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。 客户端和服务器发送的命令或数据一律以 `\r\n` (CRLF)结尾。 2. Redis制定了 RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易被人类识别。 # 发送命令 RESP 在 Redis 1.2 版本中引入, 并最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式。 在这个协议中, 所有发送至 Redis 服务器的参数都是二进制安全(binary safe)的。 RESP 的规定一条命令的格式如下: ```shell *<参数数量> CR LF $<参数 1 的字节数量> CR LF <参数 1 的数据> CR LF ... $<参数 N 的字节数量> CR LF <参数 N 的数据> CR LF ``` **命令本身也作为协议的其中一个参数来发送。** 例如我们经常执行的 SET 命令,在命令行中我们输入如下: ```shell SET key value ``` 使用 RESP 协议规定的格式: ```shell *3 $3 SET...
拿客-三产 发布于 2个月前 阅读 3488 评论 7 点赞 5

springmvc集成shiro后,session、request姓汪还是姓蒋?

# 1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小纠纠。 (1)** 在spring controller中,request有何不同呢 **? 于是,在controller中打印了request的类对象,发现request对象是org.apache.shiro.web.servlet.ShiroHttpServletRequest ,很明显,此时的 request 已经被shiro包装过了。 (2)众所周知,spring mvc整合shiro后,可以通过两种方式获取到session: **通过Spring mvc中controller的request获取session** ``` Session session = request.getSession(); ``` ** 通过shiro获取session ** ``` Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); ``` 那么,问题来了,** 两种方式获取的session是否相同呢 **? 这里需要看一下项目中的shiro的securityManager配置,因为配置影响了shiro session的来源。这里没有配置session管理器。 ``` ``` 在controller中再次打印了session,发现前者的session类型是 org.apache.catalina.session.StandardSessionFacade ,后者的session类型...
细肉云吞 发布于 2个月前 阅读 4027 评论 21 点赞 18

Maven工程配置代码覆盖工具Jacoco

本篇博文我们将给出示例理解如何在Maven工程中配置Jacoco和如何使用Jacoco查看代码覆盖报告~ Jacoco是一个开源的Java代码覆盖率工具,Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。 Maven工程 创建Maven工程 打开Eclipse,File->New->Project->Maven Project,新建一个Maven工程~ 点击“Next”按钮,然后填写groupId和artifactId信息后点击"Finish"按钮即可~ groupId -->  com.xxx.tutorial artifactId --> jacoco-demo 配置Jacoco 添加maven-complier-plugin <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <skipMain>true</skipMain> <skip>true</skip> <source>1.7</source> <target>1.7</target> </configuration> </plugin> 添加jacoco-maven-plugin <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.v...
王孟君 发布于 2个月前 阅读 1591 评论 3 点赞 4
顶部