keesun / mod-socket-io

Vert.x Socket.IO Module

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

java.lang.ClassCastException: com.nhncorp.mods.socket.io.impl.Namespace cannot be cast to com.nhncorp.mods.socket.io.impl.Namespace

legshort opened this issue · comments

2개 질문이 있습니다.

Eclipse 에서 maven 프로젝트로 생성하고 mod.json 파일에 "auto-redeploy": true 추가해서 자동 디플로이 활성화 시킨 이후에 아래와 같이 실행하면 서버가 구동 됩니다.

하지만 여기서 제가 target/mods/comvertx0.0.1-SNAPSHOT/views/index.html 파일을 수정함과 동시에 아래와 같은 ClassCastException이 발생합니다.
다시 확인한 결과 mod 폴더까지 가지 않고 src 폴더에 있는 파일을 수정해도 모두 동일한 오류가 발생합니다.

제가 알기로는 이런방식으로 자동으로 변경된 리소스를 감지해서 계속 서버가 구동되는거 같은데 에러가 발생하더라구요.

두번째는 mod.json 파일에 "includes": "com.nhncorp.socket-io-v0.9.10" 라고 입력 안해도 socket-io는 작동하더군요 이게 maven dependency에 제가 mod-socket-io v1.0.2를 추가해서 그런가요?

$ mvn vertx:runModEclipse
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Project - vertx 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- vertx-maven-plugin:2.0.0-final:runModEclipse (default-cli) @ vertx ---
22:50:02.221 [vert.x-eventloop-thread-2] INFO c.n.mods.socket.io.impl.Manager - socket.io started
[INFO] CTRL-C to stop server
9▒▒ 14, 2013 10:50:16 ▒▒▒▒ org.vertx.java.core.logging.impl.JULLogDelegate info
INFO: Module comvertx0.0.1-SNAPSHOT has changed, reloading it.
9▒▒ 14, 2013 10:50:17 ▒▒▒▒ org.vertx.java.core.logging.impl.JULLogDelegate error
SEVERE: Failed to deploy
java.lang.ClassCastException: com.nhncorp.mods.socket.io.impl.Namespace cannot be cast to com.nhncorp.mods.socket.io.impl.Namespace
at com.nhncorp.mods.socket.io.impl.Manager.of(Manager.java:83)
at com.nhncorp.mods.socket.io.impl.Manager.(Manager.java:68)
at com.nhncorp.mods.socket.io.impl.DefaultSocketIOServer.(DefaultSocketIOServer.java:32)
at com.vertx.server.SocketIOProtect.start(SocketIOProtect.java:55)
at org.vertx.java.platform.Verticle.start(Verticle.java:82)
at org.vertx.java.platform.impl.DefaultPlatformManager$18.run(DefaultPlatformManager.java:1278)
at org.vertx.java.core.impl.DefaultContext$3.run(DefaultContext.java:171)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:353)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:366)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Thread.java:724)

Eclipse에서 무슨 파일을 수정하던지 바로 위와같은 오류가 발생됩니다.

넵 제가 스프링원에 참석하느라 잠시 자리를 비웠었는데요. 오늘 중으로 살펴보고 답변드릴께요.

@legshort 혹시 만드신 프로젝트를 압축해서 저에게 메일로 보내주실 수 있으실까요? 재현해보지 않고서는 잘 모르겠네요. 이클립스의 빌더와 얽히는건 아닌가 싶기도 하고요. 두번째 문의주신 내용은 디펜던시에 추가해서 아무 문제 없이 동작하는게 맞습니다.

@legshort 혹시 autho-redeploy 옵션을 사용하지 않으면 정상 동작 하나요?

첨부파일 메일로 보내드렸습니다.

넵 확인했습니다. 확인해보고 연락드릴꼐요~ 먼가 라이브러리 중복 같은데 직접 돌려봐야 알 수 있겠네요.
감사합니다.

네 메일에 주신 프로젝트로 재현해 보았는데요. 결론부터 말씀드리자면 mod-socket-io는 auto-redeploy 옵션하고 같이 사용하실 수 없겠네요;;

Vert.x가 주시하고 있는 클래스들이 컴파일 되면 자동으로 다시 읽어들이는데 이미 Socket.io 가 기존에 연결되어서 사용하고 있던 인스턴스들은 남아있는 상태입니다.

그 상태에서 새로 읽어들인 클래스로 기존 객체를 캐스팅하려고 하면 클래스로더 이슈가 발생합니다.

http://zeroturnaround.com/rebellabs/video-do-you-really-get-class-loaders-a-jazoon-talk-by-jevgeni-kabanov/

여러가지 이슈가 있는데... 클래스를 읽어들인 클래스로더가 다른 경우 같은 클래스라 하더라도 사실상 다른 클래스기 때문에 호환되지 않습니다.

그래서 Namespace라는 타입의 객체가 살아있었는데 새로 읽어들인 Namespece 타입으로 캐스팅이 안되는것이죠.

아쉽지만 그 옵션의 혜택은 누리기 어려울 것 같습니다.

네 감사합니다!!