Atmosphere的填坑之旅

事情是这样的,最近在工作中要编写一个在线聊天的工具,当然了,是基于Web开发的。

自然而然的调研到了一个Framework:Atmosphere(StackOverFlow的人各种强力推荐),然后我就下了来试试看。

当然了Demo是一点问题都没法,的确发现意外的好用,而且新版完全遵循J2EE的标准来完成的,包括新的J2EE的注解等等。

这时候自然而然的要移植到自己的软件时候就发现一个问题,死活没办法调用OnMessage的状态。虽然没有仔细阅读源码(我这个人太懒了。。要改,要改),最终还是找到了原因。

这个Framework具体实现上很多都是遵循了需要时注入的原则,具体而言就是当有信息Push到了Server时,因为某些POJO没有调用相应的注入,导致压根就无响应(虽然不理解为毛心跳包和握手包都正常。。。。这个设计者有点不统一)。那么很自然的想到了,这个是不是很像Spring的那种IOC呢?

那么这个Framework压根没有Spring这个组件的,但是Demo里面却能够正常的调用,仔细对比了一下,发现了这个META-INF,这个文件夹按照以前的说明是由编译器生成的METAINFORMATION<通常来说开发者是不需要关心的。但是为了在Servlet3.0以下的容器中使用IOC,在这里做了小小的Trick,写入了META-INF.services一个接口的信息,之前一直都没有注意这些信息导致调用一直失败。

所以这个Meta-INF.services是个什么东西呢:

 

为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

 

java spi的具体约定如下 :

当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 

基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

具体再来看看我们这个程序中services里面到底写了什么:

2016-03-21 14-48-55 的屏幕截图

其实就是实现了Injectable的接口。

再来看看Injectable具体在程序中是干嘛的,追踪进去:

 

2016-03-22 11-47-02 的屏幕截图

啊哈,在Servlet初始化里面找到了踪迹。

所以呢这个函数是干什么的呢,主要干的和Spring自动装配是同一件事情。。。(为了满足标准的蛋疼。。。感觉Spring真像是个事实上的标准了。。)

所以为什么我们的Message没有发出去呢?

再来仔细观察ObjectInjectableMapper是干了什么:提供了注入的对象的限制。。。

最终,我们知道了。。其实导致不孕不育的原因,啊不。。发不出消息的原因是。。Jackson的MapperObject没有注入,导致编解码失败。。Message的注解其实是个回调函数,其中的Decoder是必须要的。。

因为ManagedSerivce是对整个Framework做的包装,所以想要使得Message的注解能够不用decoder都能生效就只能自己实现咯(当然懒鬼如我。。还是用着把,多方便呢)。

好了,自此都能说的通了。

半路出家最需要方向

本文由 ImportNew – paddx 翻译自 javarevisited

Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数据结构及编码。

由于我喜欢研究面试题,因此我已经收集了许多的面试问题,包括许多许多不同的主题。我已经为这众多的问题准备一段时间了,现在我将它们分享给你们。这里面不但包含经典的面试问题,如线程、集合、equals 和 hashcode、socket,而且还包含了 NIO、数组、字符串、Java 8 等主题。

该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者,你都能在其中找到一些有趣的问题。这里包含了一些超级容易回答的问题,同时包含经验丰富的 Java 程序员也会棘手的问题。

当然你们也是非常幸运的,当今有许多好的书来帮助你准备 Java 面试,其中有一本我觉得特别有用和有趣的是 Markham 的 Java 程序面试揭秘(Java Programming Interview Exposed)。 这本书会告诉你一些 Java 和 JEE 面试中最重要的主题,即使你不是准备 Java 面试,也值得一读。

该问题列表特别长,我们有各个地方的问题,所以,答案必须要短小、简洁、干脆,不拖泥带水。因此,除了这一个段落,你只会听到问题与答案,再无其他内容,没有反馈,也没有评价。为此,我已经写好了一些博文,在这些文章中你可以找到我对某些问题的观点,如我为什么喜欢这个问题,这个问题的挑战是什么?期望从面试者那获取到什么样的答案?

这个列表有一点不同,我鼓励你采用类似的方式去分享问题和答案,这样容易温习。我希望这个列表对面试官和候选人都有很好的用处,面试官可以对这些问题上做一些改变以获取新奇和令人惊奇的元素,这对一次好的面试来说非常重要。而候选者,可以扩展和测试 Java 程序语言和平台关键领域的知识。2015 年,会更多的关注并发概念,JVM 内部,32 位 JVM 和 64 JVM的区别,单元测试及整洁的代码。我确信,如果你读过这个庞大的 Java 面试问题列表,无论是电话面试还是面对面的面试,你都能有很好的表现。

Java 面试中的重要话题

除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题,也确保包含所谓的高级话题,这些话题很多程序员不喜欢准备或者直接放弃,因为他们的工作不会涉及到这些。Java NIO 和 JVM 底层就是最好的例子。你也可以将设计模式划分到这一类中,但是越来越多有经验的程序员了解 GOF 设计模式并应用这些模式。我也尽量在这个列表中包含 2015 年最新的面试问题,这些问题可能是来年关注的核心。为了给你一个大致的了解,下面列出这份 Java 面试问题列表包含的主题:

多线程,并发及线程基础
数据类型转换的基本原则
垃圾回收(GC)
Java 集合框架
数组
字符串
GOF 设计模式
SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则
抽象类与接口
Java 基础,如 equals 和 hashcode
泛型与枚举
Java IO 与 NIO
常用网络协议
Java 中的数据结构和算法
正则表达式
JVM 底层
Java 最佳实践
JDBC
Date, Time 与 Calendar
Java 处理 XML
JUnit
编程

 

继续阅读“半路出家最需要方向”

远古时代

最近一直在抱怨,靠,现在的工具好难用阿,怎么写程序还是那么困难啊。怎么写个页面各种乱七八糟的方法不能重用阿,之类的。

直到今天看了Java网络编程,我才发现,我们是现在的编程环境已经是天堂了。那我就来说说未被Servlet技术包装之前的网络编程是如何的。

socket是从jdk1.0开始被Java支持的(之前就不清楚了,知道API文档是这么的说)。计算机网络有很多层,在我这里,socket是属于应用层(用TCP/IP协议用应用开发),再底层的我们不讨论。

那么如何在Java中通过Socket来使得两个计算机进行通信了。以下是一个最简单的Socket client的程序:

继续阅读“远古时代”

转载:如何提高使用IDE的效率,尽可能全键盘的操作–原文出处: JeremyHe

这是从Philippe Breault的系列文章《Android Studio Tips Of the Day》中提取出来的自认为精华的部分。这些技巧在实际应用中能够非常大的提高工作效率。

关于快捷键

The File Structure Popup

ctrl+f12
此快捷键可以调出当前文件的大纲,并通过模糊匹配快速跳转至指定的方法。
勾选上“show anonymous classes”后其功能相当于Eclipse中的ctrl+o

10-8-1

The Call Hierarchy Popup

继续阅读“转载:如何提高使用IDE的效率,尽可能全键盘的操作–原文出处: JeremyHe”

Web.XML

做Java Web开发,即使不用到web.xml也会知道。

WEB容器的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet。并且这些元素可以配置在文件中的任意位置。

加载过程顺序如下:

  1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。
  2. 紧接着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
  3. 容器将<context-param>转换为键值对,并交给servletContext。
  4. 容器创建<listener>中的类实例,创建监听器。

web.xml就是一个说明文件,说明这所在的webapp的,名字,版本,运行的服务,在Jboss中,deploy一个App就是让Jboss读取到web.xml并且成功解析和加载。(Tomcat也一样)。

以下是一个各种tag的详细展示的example:

继续阅读“Web.XML”

库管理

好吧,入职三个月了,终于开始正式能够了解这个项目的组织结构了。以下内容不会涉及到公司的具体业务。仅仅从库管理的角度来描述一下我开始能学到的东西。

我们工作中离不开各种库,比如说SSH框架,就有Struts2,Spring,Hibernate的Jar包,更多的,分词,图像处理等等。

当然了,如果一个项目完完全全的是一个公司完全从轮子造起,在开始的时候库管理不会太难。但是等到项目逐渐的进入到了维护和升级阶段库管理就开始变得困难了。更不要说现在项目更多的依赖于别人写好的开源库。

开源库的优点在于,当有人维护的时候功能总能够更新更快更强(理想大部分状态下,不排除有的程序猿越做越烂),但是更新更快更强就代表着接口有可能发生改变,不管项目开始的时候抽象接口做的有多好,最终在某个时间点一定会发生了变化。这带来的是建造整个项目的基础有可能发生了变化,这时候我们就要稳定压倒一切了。那么库不再升级了,保持项目开始的版本就好了。

继续阅读“库管理”

依赖依赖还是依赖

蠢爆了的Java各种依赖关系其实很繁琐的。

然而更繁琐的是全程手工管理,呵呵哒。

下午就遇上了个蠢事情,ant编译完之后,硬是各种类找不到,最后一看目录结构,少了几百兆的东西。拷过来完事。

要说这个,这个真没法分析,提示的信息就是缺少类,而且缺少的不止一种。

感觉自己还是要多记住基础,多读错误。