你可能对技术本身没有多大的兴趣,但是这次研究的思路还是值得看看的。
JBossESB是一个典型的以消息为基础做的一个ESB实现,但是在消息交互上,感觉存在很大的问题。而JBossESB提供了一个超级简单的接口——ServiceInvoker,使繁琐的操作变的简单。
但在远程访问的问题上,一直没有解决。官方文档上说是需要配置jndi,但具体怎样配置却没有说。于是我就开始了被官方文档坑之旅。将jndi各种位置各种放,但就是实现不了远程访问。最后直接就放弃使用这个类进行远程访问,而采用直接发JMS消息的方式来访问远程的服务。
但是出来混,问题要还的。自己封的类,在远程访问的效果上,很不理想。由于没有开始大规模的使用,对其底层了解起来还是有些难度,所以研究ServiceInvoker又提上了日程。
这次的研究,选择代码跟进的方式,采用断点运行来判断到底怎样使用此类。重点说我的思考过程。
首先,先看了一下ServiceInvoker的构造方法,看到实质上只有一个ServiceInvoker(Service service,List<Extension> extensions)这样的构造方法。
而service这个类其实只包含服务的名字,不包含任何地址相关的信息,所以这个方向可以不走。那么就应该看看extensions这个参数在这个类里面的应用了。
恰巧的是,在一个post方法中(此方法是用来发送消息的),对这个参数进行了使用。最后一直跟随到EPRHelper这个类的copyEPR这个方法,在这个方法结束的时候,对extensions这个参数处理完毕了。
值得一提的是,对于extension这个类的参数如何赋值,以及参数是什么样的,文档中没有说明,只能靠自己试。参数最少的构造方法是3个,那么就以此来试。由于自己看了一下后面的代码,所以知道第二个和第三个可以设置为空,所以就把第一个参数写成了目标地址:
Extension extension1=new Extension("jns://192.168.1.1:1099",null,null);
于是在断点出得出了这样的对比(本人分析后的结果):
本地接口:< java....url, jbossesb, http://s..jbossesb, Jianxin-PC:1099 >
远程接口:< //192.168.1.1:1099, jbossesb, http://s..jbossesb, null >
而jbossesb是第二个参数的默认值,http://sche..是第三个参数的默认值,所以,三个参数的是不可能完成远程设置的。所以试了一下四个参数的构造函数,如下:
Extension extension1=new Extension("java.naming.provider.url",null,null,"jns://192.168.1.1");
在断点处得出了这样的对比(本人分析后的结果):
本地接口:< java....url, jbossesb, http://s..jbossesb, Jianxin-PC:1099 >
远程接口:< java....url, jbossesb, http://s..jbossesb, jnp://192.168.1.1:1099 >
此时,就做出了大胆的推测,可以成功调用远程服务了。结果也正如预测。
但为什么刚开始的时候就没有弄出来呢?jndi文件不起作用的时候,就想到查看源码来查看源码来解决,但还是恐惧代码的复杂与多,然后就没有进行下去。
人有时候就是得逼自己一把,不然,真的就那么过去了。只想说,这样一来,很多问题就可以解决了。Demo性的工作已经差不多了,下一步就是先搭建两个简单的系统,然后从应用的层次来实现ESB的交互~~