SargerasWang's Blog

我常常思考为什么鸟儿拥有整片天空,却常常停留在一个地方。然后我问了自己同样的问题。

generatePrivate Exception 解决

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format 异常解决

私钥是直接生成的pkcs8格式,类似如下:

1
2
3
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL21hi3tyVA2ILrk
...
+bojB4QWBQi9zg==

直接在代码中使用String存储,利用类似如下代码进行签名:

SseEmitter DefaultHandlerExceptionResolver : Async Timeout for GET 解决

使用SpringMVC搭配HTML5的EventSourceSseEmitter如下:

1
2
3
4
5
@RequestMapping("connect")
public SseEmitter connect(){
    SseEmitter emitter = new SseEmitter();
    return emitter;
}

这样会抛出如下异常:

1
DefaultHandlerExceptionResolver : Async timeout for GET

原因是请求到timeout时间就会超时,new SseEmitter(long timeout);是可以设置timeout的,单位是毫秒,但是设置为60000L(一分钟),也是一样的,每分钟都会抛出这个异常.

最后解决办法,timeout永不过时,timeout设置为0,如下:

1
2
3
4
5
@RequestMapping("connect")
public SseEmitter connect(){
    SseEmitter emitter = new SseEmitter(0L);
    return emitter;
}

就不会抛出异常了,前端用类似如下代码即可:

1
2
3
4
5
6
7
8
9
10
11
var eventSource = new EventSource("/sse/connect");
eventSource.onmessage = function(event){
    //event.data 是数据
}
eventSource.onerror = function(err){
    if(err.target.readyState == 0){
        //消息服务异常,无法创建连接
    }if(err.target.readyState == 2){
        //消息服务断开,无法及时收到消息
    }
}

Netty org.msgpack.MessageTypeException: Expected Array but Got Not Array Value

在使用Netty时,client给server发送消息,突然大量并发请求发送消息,抛出以下异常

1
2
org.msgpack.MessageTypeException: Expected array but got not array value
    at org.msgpack.unpacker.Converter.readArrayBegin(Converter.java:202) ~[msgpack-0.6.12.jar:na]

看起来是msgpack的问题,debug发现如果单步debug,就没有问题,并发时才会出现,google以上内容并没有解决问题.

最后找到原因,是因为没有解决粘包拆包,解决方法如下:

1
2
3
4
5
6
socketChannel.pipeline()
        .addLast("frameDecoder",new LengthFieldBasedFrameDecoder(1024,0,2,0,2))  //
        .addLast("msgpack decoder",new MsgpackDecoder())
        .addLast("frameEncoder",new LengthFieldPrepender(2))  //
        .addLast("msgpack encoder",new MsgpackEncoder())
        .addLast(serverHandler);

主要是上面的.addLast("msgpack decoder",new MsgpackDecoder()).addLast("msgpack encoder",new MsgpackEncoder()).

问题解决.