重温RO

RO即仙境传说,5年前曾风靡一时的一款网游佳作. 年少的我被这款网游深深的吸引.至此今日,很多网游都能看到RO的身影. RO开创了转职模式. 自由的配点,让职业不单单像外表看到的那样.

会拿书砸人的牧师,法力高强的骑士,这些打破常规的自由组合正是RO的魅力之处.

曾今的外挂毁了RO,RO的辉煌也已经过去. 正如这天道盛久必衰一样. 任何一款网游都会有这一天的. 今天重温RO 无非是儿时的梦想罢了.

如今工作繁忙,也不知道能有多少时间重温这个梦. 望RO有重新回到人们视野中的那天.

偶在新服  天空之城  ID: fengsage  O(∩_∩)O~ 有志同道合的朋友一起重温吧·

Apache Servicemix 教程 – CXFSE

前面我们讲了Servicemix最常用的组件之一CXFBC的使用,几乎常见的接口开发都会用到,这里我们介绍CXFSE,从名字上可以看到这是一个SE组件.属于JBI内部的数据处理单元.

SE 即 Service Enging 服务引擎,JBI一个重要概念,基本概念参考此处 

从官网上我们可以看到下面几个特征

  • JSR-181 annotations
  • JAXB2/Aegis/XMLBeans databinding
  • WSDL auto generation
  • Java proxy support
  • MTOM / attachments support

我们关心最后2个,其实这几个都属于WebService或CXF框架本身的范畴,这里因为Servicemix用到了CXF所以这些特征也带了,想获得详细特性的请访问CXF官网.

其实简单来说,CXFSE最主要的功能是用代码发布一个WSDL,但是,这个WSDL是在JBI容器内的,不对外的,因为CXFSE是一个SE组件而非BC组件,根据JBI规范,不能用于协议转换.

CXFBC+CXFSE 可以做到在Servicemix容器内发布自己的Webservice. 虽然这种做法比较少见,因为Servicemix主要把现有的系统集成,而不是自己发布服务.

一、Java Proxy

官网上这句话解释的非常清楚,‘You can create java proxies for JBI endpoints, provided that they expose a WSDL.’

要理解这句话,首先要明白一件事,即JBI内部用来描述一个服务,也是采用了WSDL规范,这不能说是JBI就是WSDL规范,只能说是JBI用了WSDL规范来描述自身的服务.因此这里我们可以很显性的把一个JBI的组件向外暴露出WSDL,通过CXF-BC直接暴露给外部.当然一般业务角度上来说,这是危险的.

二、MTOM Support

CXF支持MTOM,Servicemix没理由不支持,只需按如下申明即可

结合上面说的一对P话,我们来实际做一个例子,即Servicemix发布一个服务,该服务允许上传附件,即用到了CXFBC+CXFSE+MTOM这些.

待续…

男儿当自强~刘伟

好男儿,当如刘伟,身残志不残,修身养性,孝顺父母~

Apache Servicemix 教程 – CXFBC

主要介绍下Servicemix最常用的组件之一servicemix cxfbc的使用,官方上有比较详细的文档,英文好的朋友可以直接点击查看

  CXF 同时也是apache的一款webserivce框架.Java开发者可以使用cxf快速的发布webserivce或者作为客户端调用别的webserivce.

  在Java世界里,webserivce本质上就是把java bean对象序列化成xml文本,并包装成SOAP格式的消息传递到服务端,由服务端反序列化xml消息到java bean调用相关服务.

Note:这里的序列化和反序列化,涉及到2个标准,即jax-rpc和jax-ws规范 这2个规范无论是对SOAP的格式还是java-xml间互转都有着本质上的不同.JDK1.5以后,sun已经把jax-rpc移除了jdk中去. JDK1.5开始都采用jax-ws规范. 这里cxf同样只支持jax-ws规范.

  我们先来写一个简单的webservice程序,充当集成的一个系统,我们称这个系统为mock系统. 如何开发一个webserivce不是这里的重点,可以点击此处下载已开发完好的webservice程序,只需把war包扔到Servlet容器内部署即可. 这里我们假设我需要集成一个订单受理系统.

  浏览器内输入 http://localhost:8000/mock/services/order?wsdl   打开如下图,则启动正常

TM截图未命名

好了,我们开始对这个mock系统进行集成,因为是例子,我做的尽量简单,只使用cxfbc一个JBI组件来开发,现实环境中一般还用上xslt作为数据树结构转换,这里我们先不用.

一、编写自定义WSDL,

  CXFBC是一个BC组件,简单来说其实是一个WebService的代理组件,使用这个组件我可以不写任何一行代码,来和一个现有的WebService进行连接,虽然不用写代码,但我们却需要编写一个WSDL文件,这样ESB暴露给别的系统的就是这份WSDL文件,调用后CXFBC组件会把这份WSDL产生的SOAP消息,发往外部系统,这里是我们的mock系统.

大致关系如下:   
Client   — soap –>   ServiceMix(Custom WSDL) – soap – > mock

这里为了演示,我就自己不写WSDL了,直接把mock发布的WDSL拷贝一份即可,但要注意修改几个地方,参考下面WSDL.

 

XML语言: 临时自用代码
<?xml version=”1.0″ ?><wsdl:definitions name=“OrderServerImplService” targetNamespace=“http://www.fengsage.com/order” xmlns:ns1=“http://cxf.apache.org/bindings/xformat” xmlns:soap=“http://schemas.xmlsoap.org/wsdl/soap/” xmlns:tns=“http://www.fengsage.com/order” xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/” xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
  <wsdl:types>
<xs:schema attributeFormDefault=“unqualified” elementFormDefault=“unqualified” targetNamespace=“http://www.fengsage.com/order” xmlns=“http://www.fengsage.com/order” xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
<xs:complexType name=“orderDetail”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0″ name=“name” type=“xs:string”></xs:element>
<xs:element name=“nums” type=“xs:int”></xs:element>
<xs:element minOccurs=“0″ name=“remark” type=“xs:string”></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name=“orderResult”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0″ name=“name” type=“xs:string”></xs:element>
<xs:element minOccurs=“0″ name=“status” type=“xs:string”></xs:element>

</xs:sequence>
</xs:complexType>
<xs:element name=“create” nillable=“true” type=“orderDetail”></xs:element>
<xs:element name=“createResponse” nillable=“true” type=“orderResult”></xs:element>
</xs:schema>
  </wsdl:types>
  <wsdl:message name=“create”>
    <wsdl:part element=“tns:create” name=“create”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name=“createResponse”>

    <wsdl:part element=“tns:createResponse” name=“createResponse”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name=“OrderMockServer”>
    <wsdl:operation name=“create”>
      <wsdl:input message=“tns:create” name=“create”>
    </wsdl:input>
      <wsdl:output message=“tns:createResponse” name=“createResponse”>
    </wsdl:output>

    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name=“OrderServerImplServiceSoapBinding” type=“tns:OrderMockServer”>
    <soap:binding style=“document” transport=“http://schemas.xmlsoap.org/soap/http”></soap:binding>
    <wsdl:operation name=“create”>
      <soap:operation soapAction=“” style=“document”></soap:operation>
      <wsdl:input name=“create”>
        <soap:body use=“literal”></soap:body>
      </wsdl:input>

      <wsdl:output name=“createResponse”>
        <soap:body use=“literal”></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name=“OrderServerImplService”>
    <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderMockEndPointPort”>
      <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
    </wsdl:port>

  </wsdl:service>
</wsdl:definitions>

 

注意<wsdl:service name=”OrderServerImplService” 和 <wsdl:port name=”OrderMockEndPointPort” 我们要修改成如下:

XML语言: 临时自用代码
<wsdl:service name=“OrderServerESBService”>
  <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderESBEndPointPort”>
    <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
  </wsdl:port>
</wsdl:service>

由于对Servicemix来说,外部系统(mock),也是一个endpoint,所以这里service name和endpoint name不能和外部系统一致,改成不同即可.

二、建立Servicemix工程

  这里使用maven脚本建立.

  1) 创建ROOT目录

C: mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb

2) 创建CXFBC组件

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-cxf-bc-service-unit -DarchetypeGroupId
=org.apache.servicemix.tooling -DartifactId=cxfbc -DgroupId=com.fengsage.esb

3) 把前面自定义的WSDL文件放到srcmainresources 系统classpath 路径下

4) 编辑CXFBC组件的xbean.xml

XML语言: 临时自用代码
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=“http://www.springframework.org/schema/beans”
       xmlns:cxfbc=“http://servicemix.apache.org/cxfbc/1.0″
       xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
       xmlns:esb=http://www.fengsage.com/order
       xsi:schemaLocation=“http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/schema/servicemix-cxfbc-3.2.3.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>
  
  <cxfbc:consumer wsdl=“classpath:custom.wsdl”
                service=“esb:OrderServerESBService”
            endpoint=“OrderMockEndPointPort”
                  locationURI=“http://localhost:8193/ESB/1″
            targetService=“esb:OrderServerImplService”
                  targetEndpoint=“OrderMockEndPointPort”/>

  <cxfbc:provider wsdl=“http://localhost:8000/mock/services/order?wsdl”
                service=“esb:OrderServerImplService”
                  endpoint=“OrderMockEndPointPort”/> 
</beans>

5) 创建SA组件,进行打包

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=or
g.apache.servicemix.tooling -DartifactId=sa -DgroupId=com.fengsage.esb

6) 手动调整SA组件里的POM文件,添加下面几行,通知SA编译时把CXFBC组件打包进去

<dependency>
  <groupId>com.fengsage.esb</groupId>
  <artifactId>cxfbc</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

7) 编译

C:Root>mvn install

8) 发布

  进入SAtarget目录,可以看到有个生成的sa-1.0-SNAPSHOT.jar文件把这个文件放到ApacheService的hotdeploy目录,启动Servicemix即可.或运行下面命令可以直接发布

C:Rootsa>mvn jbi:projectDeploy -o

如无错误,应该有下面提示

INFO  – ServerImpl                     – Setting the server’s publish address to be http://localhost
:8193/ESB/1

10) 打开http://localhost:8193/ESB/1?wsdl 进行浏览,可以看到这个就是我们在ESB发布的WebService了

11) 测试

  我们使用一款免费的WebService测试工具, SOAP UI , 官方地址

<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:ord=”http://www.fengsage.com/order”>
   <soapenv:Header/>
   <soapenv:Body>
      <ord:create>
         <id>?</id>
         <!–Optional:–>
         <name>?</name>
         <nums>?</nums>
         <!–Optional:–>
         <remark>?</remark>
      </ord:create>
   </soapenv:Body>
</soapenv:Envelope>

Apache Servicemix 教程 – 安装部署

简单介绍下Servicemix安装、使用、部署,并简单介绍下Servicemix简单配置.

安装

  1. 下载Servicemix  http://servicemix.apache.org/download.html 由linux和windows两个不同版本
  2. 解压到指定文件夹(zip/tar.gz)

Note:目前最新版本是3.3.2 和 4.0.0

运行

  1. cd <SERVICEMIX_HOME>
  2. windows:   .binservicemix.bat
    linux:          ./bin/servicemix

Note:由于linux启动servicemix,会随终端退出而关闭,需要使用nohup命令,使其脱离终端独立运行

部署

Servicemix提供2种主要监控方式

  1. 热部署目录. 即把开发好的SA直接放到<SERVICEMIX_HOME>hotdeploy目录中去即可
  2. 脚本部署. Servicemix运行使用ant或maven脚本方式,直接把开发好的SA植入到JBI容器内

Note:Servicemix提供了部署MBena,用户可以使用此MBean开发第三方程序进行部署

监控

Servicemix并没有提供第三方监控工具,而是推荐使用sun的jconsole工具,该工具位于JDK bin目录中和java
、javac等命令在一个目录下,操作如下

  1. 命令行输入jconsole
  2. 在远处连接处输入”service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi“  默认用户名和密码都是smx
  3. 点击”连接”按钮即可对Serivicemix内部资源进行监控

Note:Servicemix的第三方生产商FUSE提供了HQ监控工具,但是由于不开源,所以大家无福消受了.

 

关于开发

官方推荐使用maven作为Servicemix的开发工具,个人也强烈推荐,简单方便.详细的maven教程可以参考maven官方网站.http://maven.apache.org/

这里简单讲一下如何建立一个Servicemix工程,后面实例中讲详细介绍

  1. 创建一个root工程
    mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  2. 创建任意SU组件,各个组件对应的maven id 都可以从下面网址中得到
    http://mvnrepository.com/artifact/org.apache.servicemix.tooling
  3. 创建SA组件,对于每个servicemix工程,都需要打包成SA文件才能部署到JBI容器中去.
    mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  4. 编译,在root目录下,输入maven install 或 maven clear install 即可完成编译
  5. 打开编译后的*sa文件夹,找到target文件夹,里面有个*.jar文件即使我们打包后得到的SA文件,部署到servicemix容器中即可.

Apache Servicemix 教程 – 介绍及理论

经过一年来ESB学习和工作的部分经验.即给自己总结的时间,把脑海中关于ESB的部分进行整理,也留下点心得,也想和对ESB感兴趣,有研究的朋友进行交流.不足之处望予以批评指正.

基础概念

1. ESB

ESB(Enterprise Service Bus)是为了解决企业生态群落内大量系统间因为交互繁琐导致维护成本增加而产生的.下图是典型的传统多系统间数据交互图.随着生态群落的扩大,越来越多的系统加入,导致维护这些系统的通讯成本越来越多

clip_image002[4]

ESB的诞生就是为了解决上图中的这些问题,下图可以可以看到ESB所解决的实际问题.

clip_image004[4]

2. Apache Servicemix

Apache是著名的开源社区,正对不同应用都有很多对应的开源产品,对开源有兴趣的朋友可以进入官网学习. 对于ESB. Apache主要有2款产品: Synapse 和 Servicemix

  1. Synapse,这款产品是apache早期的一款ESB产品,诞生于JBI规范制定之前,属于众多ESB产品中一个普通的产品,并没有什么太吸引人的地方. 但随着WSO2这款新ESB的兴起,发生了点改变.WSO2是WSO2公司正对Synapse进行二次开发后的产物,因为使用了apache licese因此也开源.并且提供了强大的可视化界面,通过几步简单的配置就能完成系统间接口的集成.
  2. ServiceMix,我们重点讲这款产品.这款产品是目前Apache主推的一款ESB产品,遵循了JBI规范,可以很方便的进行二次扩展,其自带的组件基本能完成一般系统集成的需要,是构建SOA的良好产品.目前Servicemix主要有2个版本在维护,即3.*和4.*两个版本,这里我们讲3.*版本.

3. Apache CXF

目前比较成熟功能比较齐全的webserivce工具.可以用来发布自己的webserice程序,并能作为webserivce的客户端. Servicemix使用cxf作为其webserivce的一个发布工具.

4. Apache Camel

Apache Camel是一个开源的企业应用集成框架。它采用URI来描述各种组件,这样你可以很方便地与各种传输或者消息模块进行交互,比如HTTP、 ActiveMQ、JMS、JBI、SCA、MINA或CXF Bus API。该路由完全参照了《Enterprise Integration Patterns》一书中各种路由模式的规则. Servicemix使用camel作为其核心消息路由器.

5.  Apache derby

Apache一款文件型数据库,可以方便的内嵌到任意程序中去,也可以以内存作为数据库存储.比较适合开发系统初期使用. Servicemix用来对一些NMR消息的记录.

6.  Apache activemq

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

7.  JBI

Sun用来规范ESB领域而制定的一个规范,当然目前遵守这一规范的ESB产品不多,Servicemix算是其中一个良民.
Servicemix从本质上来说就是一个JBI的容器,任何符合JBI规范的组件都可以放到这个容器里,成为Servicemix的一部分.JBI协议是smx里的重点,简单来说JBI协议分为下面几部分.

  1. Bind Component(BC) 即消息绑定组件,用于对不同消息进行转换.把收到的各种消息统一转换为JBI消息.也把JBI消息转换成各种协议发往外部系统.eg:
    servicemix-file                 IO组件,允许对把IO文件传入Servicemix
    servicemix-ftp                 支持FTP协议,允许使用FTP上文件传入Servicemix
    servicemix-http               支持Http协议,允许通过Http接受文件
    servicemix-jms                支持JMS协议,允许接受JMS消息
    servicemix-xmpp             支持XMPP协议,允许实时同步消息
    servicemix-cxfbc             支持WebService,允许接受soap消息,此组件不支持jax-rpc规范
    ……
  2. Server Engine(SE) 即服务引擎,简单来说就是把从BC组件收到的消息进行二次处理,比如路由消息,树结构转换, eg:
    servicemix-bean            允许自定义bean,可以自行对消息进行自定义处理
    servicemix-camel           允许对消息路由处理
    servicemix-jsr181           允许自定义通过代码发布WebService接受soap并处理消息
    servicemix-quartz          消息定时处理
    servicemix-saxon           消息格式转换,支持xslt
    servicemix-script            允许在嵌入动态语言对消息进行处理
    ……
  3. Normalized Message Route(NMR) 即标准消息路由,在JBI规范中,BC收到消息后,不能直接传递给下一个BC或者SE进行消息处理,这些传输必须通过NMR转发,NMR转发的消息已经是标准的JBI消息,Servicemix也支持对soap消息进行NMR传递
  4. Delivery channel 即传输通道,上述NMR消息传输的通道
  5. Service Unit (SU) 即服务单元,用户编写的服务的最小单位,每个服务单元都有自己的逻辑进行处理.例如,消息转换,消息路由,通过一个或多个SU的组合完成一次接口调用
  6. Service Assemblys(SA) 即服务集合,简单来说就是把SU大包成SA文件,然后部署到Servicemix中去

先写到这,以后继续补充,ESB设计到太多的J2EE知识,几乎涵盖了J2EE所有特征.

央视爆破失败..谎话张嘴就来!

我的神啊~~ 难道是瞎话说习惯了?

喜欢仙剑,需要理由吗?

一个游戏,一首歌,当我闭起眼睛,一个个故事,一个有一个镜头在我们眼前闪过,这些是虚幻吗?

Play非常不错的java敏捷框架

前几天了解了下Play这个框架. 原本1年前就对java web已经死心了的我,又有点重找回信心了.

不想去回忆java做web开发的痛苦了,框架间乱七八糟的组合,有无意义暂且不说,一个简单的增删改查,光写类就要写N个,出了错还得一个个debug过来.痛苦啊!所以年前就“背叛”Java 加入python阵营了. 用python做web真是优美,而且快速简单.至于很长时间对struts,webwork这种框架有点恶心.

感觉java除了高性能应用外,在web上简直就是糟糕透顶了. 然而不久前一次偶然的机会,让我了解了Play,彻底打破了我的想法,原来java也可以敏捷.也可以像python那样精简,快速.

这几天研究,做了官网上的Yabe例子,当然没做完(admin CRUD对现实意义不大),总结了下面几个优点:

  1. 自动编译,无需重启. 个人最欣赏的地方,总算可以摆脱一修改代码就要重启服务器的窘境了,事实上在调试阶段,重启服务器的时间远远大于修改代码所需的时间,时间大大浪费在毫无意义的等待上面了.
  2. 优美的URI映射. 貌似大部分敏捷框架,都在这里大下功夫.根据不同的URI,自动映射到不同的view层,别拿struts这种恶心人的uri映射来比,敏捷的uri映射更加灵活,更加强大.
  3. 简单的MVC层次. 不知道哪位规范了MVC模型,心意是好的,但是国内大部分web应用都瞎套了MVC,总之,我感觉struts之流引入MVC的概念不是简化了开发,而是大大增加了工作量,什么dao,daoimpl,server,serverimpl,view… 要多细可以写多细,然后我们自己问自己,真的有必要这么’细致’吗?敏捷告诉我们答案,mvc可以如此简单. Web技术的核心就是 “提交表单,操作数据库”.
  4. 强健的模板语言. 总所周知,一般java运用主要采用freemwark这种模板框架,究其原因还是JSTL这种标签表现力不够丰富,不够灵活,很难满足一般应用的需要.play模板语言重复吸取了ror,django这种脚本语言框架. 到处可以看到ror的影子.这点说不清楚,大家自己实际看一下就能明白,play的模板是多么的敏捷.
  5. Model. 最后写这点,因为这点也是java作为静态语言的无奈,不可能像python这样做成完美的充血模型,Play的model是基于JPA规范,也模仿动态语言写了增删改查的常见方法,但说到底这些都不是很好. Model也是个人觉得比较遗憾的地方了.

以上是这几天闲暇之余查看Play文档和做些例子的一些感受和想法. 粗浅的地方还望大家指正.

免费手机天气预报

前段时间突然想研究飞信(fetion),因为觉得利用飞信发手机短信是个不错的方法.

于是就诞生了此程序,目前测试中 http://fengsms.appspot.com/ 大家可帮忙进行测试.

使用本程序用户需遵守2条原则

1. 必须是移动用户且绑定飞信,程序基于飞信,所以是免费的.具体可以参考飞信官网

2. 原则上只要是飞信好友,都可以通过此程序发送消息,建议不要乱加好友,否则会被移动认定垃圾短信导致封号(飞信号)

使用方法

1.注册   打开http://fengsms.appspot.com/ 左边即可注册.简单填写用户名和密码即可

2.登录   打开首页右边即可登录

3.输入手机号码和飞信口令. 这里声明,本程序的原理是模拟飞信登录,因此需要飞信口令,否则哪有免费短信一说,因此这里会记录用户的手机号码和飞信密码.本站不会想任何人透露.由于飞信是和手机绑定,因此只需要发送’新密码’到12520050即可重置密码.

4.输入后,请先点击’激活’按钮,如果担心密码输入错误,请点击旁边的’测试’按钮.如果有测试短信成功发送到手机,则口令正确

5.点上面导航条的’发送列表’.

6.在新增用户表单中输入带发送的手机号码和号码所在城市的拼音. 注意,系统默认不会给任何人发送天气预报包括自己,请把自己加入列表中.

7.可以点’立刻发送’按钮.测试是否收到当天天气情况.

 

注:程序测试中. 会出现不稳定情况,请各位海涵.

第 5 页,共 13 页« 最新...34567...10...最旧 »