Arganzheng's Blog

stay hungry, stay foolish

return async result in java

在java中,异步操作往往喜欢返回一个Future对象,顾名思义,表示结果在未来的某个时刻才完成,虽然future是立马返回的,但是其实是一个未知的结果。调用方可以(需要)查询这个future对象,看是不是已经出结果了。其实是一种polling方式来的。 这些Future对象,一般都是实现java.util.concurrent.Future接口: package java.util.concurrent; /** * A <tt>Future</tt> represents the result of an asynchronous * computation. Methods are provided to check if ...

Java并发学习笔记

线程 线程VS进程 lightweight processes fork is expensive. Memory is copied from the parent to the child, all descriptors are duplicated in the child, and so on. Current implementations use a technique called copy-on-write, which avoids a copy of the parent’s data space to the child until the child needs its own copy. But, ...

高并发下额度限制问题

问题 在很多场景下资源是有额度的,跟事务一样,我们要求资源不多不少的分配出去。比如 普通会员只能免费发布10个产品 火车票订票系统 秒杀系统 抽奖系统 流量控制系统 等等,非常常见。 一般的想法就是:假设资源S的总份额是C,当前已经消耗的份额是X(或者已知当前剩余的份额为N)。每个用户要获取资源时,我们做如下判断: C = getTotalResourceCount(); X = getResourceConsume(); if (X>C){ // allow,用户可以进行 发布产品,下单支付等。 }else{ // out of resource! } 这段程序在单用户可以运行正确,但是在分布式高并发下...

Rest Response and Exception

在笔者的上一篇博文 Restful Spring MVC 中,详细的介绍了使用Spring MVC构建RESTful的web应用的各个方面,不过对于RESTful应用还有很重要的一块笔者没有介绍到,就是异常和错误信息rest化。 对于一个RESTful web应用,正常情况下,应该返回一个200的HTTP response,返回内容格式由ContentNegotiatingViewResolver协商决定,一般是json或者xml格式。如果出错了,业务一般是抛出业务异常,如果没有特殊处理,那么将返回一个出错HTML页面,状态码是500。我们希望这些异常能够映射到HTTP status,并且能够按照json/xml的格式返回,这时候就需要引入Spring MVC的H...

如何解决time_wait状态占用端口问题

问题 在restart服务端的时候,总是发现启动失败,端口被占用。需要先stop,然后等待一段时间,再start。分析了一下,确定是time_wait导致端口缓慢释放问题。 相关背景知识 一、Linux服务器上11种网络连接状态: 通常情况下: 一个正常的TCP连接,都会有三个阶段: TCP三次握手 数据传送 TCP四次挥手 同时会有三种特殊的数据包 SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。 ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有...

开放平台主动推送预言

主动推送的好处 实时性: 每次数据的变化基本都在毫秒内返回给应用程序 提升用户体验 服务端数据过滤:不是轮询拉到数据再进行处理,可以指定推送条件(比如IFTTT)。 减少服务器压力(开发者轮询) 易用:只需要一个HTTP请求,就可以不停的接受消息,同时官方提供了SDK,开发者只需要简单实现接口,处理业务数据。 常见应用场景 订单状态变化 物流信息 商品价格/上下架(导购类网站) 示例 订阅商品变更通知 从polling pull到real time push 在主动推送之前,只能使用client不断polling接口的方式。无法实时获取数据,对服务端也是一个压力。这正是 观察者模式 最适合解决的问题。 ...

content negotiation using spring mvc

元数据管理平台的REST接口突然抽风,总是返回XML格式,不管我怎么设置accept头。Debug了一下,发现每次都是优先使用ServletPathExtensionContentNegotitionStrategy。谷歌了一下,原来Spring默认的三个ContentNegotiationStrategy是PPA Strategy (path extension, then parameter, then Accept header) ,顺便也是先path extension,然后parameter(默认是format参数),然后才是accept头。要让Spring使用accept头解析,只要配置一下ContentNegotiationManagerFactory...

C# Url Encoding的一些问题

最近API的C#版本SDK又出问题了,总是报sign计算错误。Sign计算问题一般是源串生成(参数排序、URL Encoding之类的)不一致,另一个就是签名算法(一般是HMAC或者MD5)不一致。首先看一下原串生成是不是有问题。 用Java和C#对同样的请求参数进行源串生成,发现果然不一样。对比了一下,发现是由于左右括号引起的。 public static void main(String[] args) throws UnsupportedEncodingException { String itemDesc = "样品材质:材质棉+聚脂纤维 颜色描述:蓝色 绿色 卡其(样品为蓝色)"; String encodingStr...

卓有成效的程序员——windows篇

windows下如何查看端口被哪个进程占用 比如要找出哪个进程占用了80端口: Here is netstat command & output to find which process is holding port 80. C:\Users\arganzheng>netstat -nao | findstr "0.0.0.0:80" TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 2608 可以看到,2608就是占用80端口的进程id。 然后可以使用tasklist 根据pid得到进程信息: C:\Users\arganzheng>tas...

JVM编码

package java.nio.charset; public abstract class Charset implements Comparable<Charset>{ private static volatile Charset defaultCharset; /** * Returns the default charset of this Java virtual machine. * * <p> The default charset is determined during virtual-machine startup and * typically depe...

×