首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hessian有关

2012-10-07 
hessian相关使用ruby版hessian客户端client.rbrequire rubygemsrequire hessian2url http://localh

hessian相关
使用ruby版hessian客户端

client.rb

require 'rubygems'require 'hessian2'url = 'http://localhost:3000/test'client = Hessian2::HessianClient.new(url)puts client.addPerson({'name' => 'q', 'age' => 18})puts client.queryPassportUidMap([Hessian2::TypeWrapper.new('Long', 37), Hessian2::TypeWrapper.new('Long', 38)])


执行

ruby client.rb


jruby启动hessian服务端

jruby调用3样东西:
hessian.jar
jetty.jar(调用jetty.jar启动性能比较差)
example.jar(只需要IPersonService接口 和 Person类)

>

写ruby实现接口:
继承HttpServlet,include IPersonService,写PersonService内容

>

靠jetty启动这个servlet

hessiand.rb
require 'java'require './lib/hessian-4.0.7.jar'require './lib/servlet-api.jar'require './lib/jetty-continuation-8.0.4.v20111024.jar'require './lib/jetty-http-8.0.4.v20111024.jar'require './lib/jetty-io-8.0.4.v20111024.jar'require './lib/jetty-security-8.0.4.v20111024.jar'require './lib/jetty-server-8.0.4.v20111024.jar'require './lib/jetty-servlet-8.0.4.v20111024.jar'require './lib/jetty-servlets-8.0.4.v20111024.jar'require './lib/jetty-util-8.0.4.v20111024.jar'require './lib/example.jar'java_import 'com.caucho.hessian.server.HessianServlet'java_import 'javax.servlet.http.HttpServlet'java_import 'org.eclipse.jetty.server.Server'java_import 'org.eclipse.jetty.servlet.ServletContextHandler'java_import 'org.eclipse.jetty.servlet.ServletHolder'java_import 'example.IPersonService'java_import 'example.Person'def main  server = Server.new(3000)  context = ServletContextHandler.new(1)  server.setHandler(context)  servletHolder = ServletHolder.new(PersonService.new)  context.addServlet(servletHolder, '/test')    server.start  server.joinendclass PersonService < HessianServlet  include IPersonService    def addPerson(person)    person.setAge(person.getAge + 1)    person  end    def queryPassportUidMap(uids)    m = Hash.new    uids.each do |uid|      person = Person.new      person.setAge(uid)      person.setName("lala#{uid}")      m[uid] = person    end    m  endendmain


启动

jruby hessiand.rb


java这边的 IPersonService接口 和 Person类

refer hessian-4.0.7.jar, servlet-api.jar

Person类
package example;import java.io.Serializable;public class Person implements Serializable {/** *  */private static final long serialVersionUID = 1L;   private int age;private String name;public Person(){}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


IPersonService接口 (hessian.jar只认接口)
package example;import java.util.HashMap;import java.util.List;public interface IPersonService {public Person addPerson(Person person);Map<Long, Person> queryPassportUidMap(List<Long> uidList);}


bin$ jar -cf example.jar example/


一些补充

PersonService实现可以写在java里,也可以交给jruby

package example;import java.lang.reflect.InvocationTargetException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import com.caucho.hessian.server.HessianServlet;public class PersonService extends HessianServlet implements IPersonService {/** *  */private static final long serialVersionUID = 1L;        public Person addPerson(Person person)    {    person.setAge(person.getAge() + 1);    return person;    }        public Map<Long, Person> queryPassportUidMap(List<Long> uidList)    {    Map<Long, Person> m = new HashMap<Long, Person>(uidList.size());    for (Long uid : uidList) {    Person person = new Person();        person.setAge(11);        person.setName("lala" + uid);m.put(uid, person);}        return m;        }    }


java版hessiand

http://jon.finanger.no/?p=639

import org.eclipse.jetty.server.Server;import org.eclipse.jetty.servlet.ServletContextHandler;import org.eclipse.jetty.servlet.ServletHolder;import example.PersonService;public class HessianTest {    public static void main(String[] args) throws Exception {        Server server = new Server(3000);        ServletContextHandler context = new ServletContextHandler(        ServletContextHandler.SESSIONS);        server.setHandler(context);        ServletHolder servletHolder = new ServletHolder(new PersonService());        context.addServlet(servletHolder, "/test");        server.start();        server.join();     } }


启动

java -cp .;jetty-server-8.0.4.v20111024.jar;jetty-util-8.0.4.v20111024.jar;servlet-api.jar;jetty-http-8.0.4.v20111024.jar;jetty-io-8.0.4.v20111024.jar;jetty-continuation-8.0.4.v20111024.jar;hessian-4.0.7.jar;jetty-servlet-8.0.4.v20111024.jar;jetty-security-8.0.4.v20111024.jar;example.jar HessianTest


用tomcat做服务器的话,拷 example.jar 到 WEB-INF\lib
或者拷 class文件 到 WEB-INF\classes\example\,
WEB-INF\web.xml 的 web-app段 里
<servlet>    <servlet-name>person_service</servlet-name>    <servlet-class>example.PersonService</servlet-class></servlet>  <servlet-mapping>    <protocol type="hessian"/>    <servlet-name>person_service</servlet-name>    <url-pattern>/person_service</url-pattern></servlet-mapping>



jruby调用官方hessian.jar和服务器通信,好处是这样的参数List<Person> persons也可以传
require 'rubygems'require 'java'require 'hessian-4.0.7.jar'require 'servlet-api.jar'require 'example.jar' #jar cf example.jar examplejava_import 'com.caucho.hessian.client.HessianProxyFactory'java_import 'javax.servlet.GenericServlet'java_import 'example.Person'factory = HessianProxyFactory.newclient = factory.create('http://localhost:8080/person_service')person1 = Person.newperson1.setName 'q'person1.setAge 18person2 = Person.newperson2.setName 'j'person2.setAge 14reply = client.addPersons([person1, person2])reply.each do |person|  puts "#{person.getName}:#{person.getAge}"end


hessian2 是 hessian 的补丁版
class HessianWriter  #...  def write_object(val, hessian_type = nil)    return 'N' if val.nil?    case val    when TypeWrapper       if val.hessian_type == 'Long'        "L%s" % to_long(val.object)      else        write_object(val.object, val.hessian_type)      end    #...  end    #...  def to_long(val)    val2 = val.to_s(2)    ['0' * (64 - val2.size) << val2].pack("B*")  end  #...endclass HessianParser  #...    def from_utf8(len = '*')    s = @data.unpack("U#{len}").pack('U*')    [ s, s.unpack('C*').pack('U*').length ]  end    #...  end

热点排行