Node调用Java的示例代码

Java 端作为服务提供者,基于Dubbo实现服务并通过 Dubbo Hessian 扩展暴露服务;Node 端作为服务消费者,通过node-hessian 调用 Java 端的服务。

Java 端

服务接口

package com.yuanxin.paas.ssb;

public interface TestService {

  /**
   * 测试:无参,无返回值。
   */
  void test();

  /**
   * 测试:原生类型参数与返回值。
   *
   * @param i
   * @return
   */
  String test0(int i);

  /**
   * 测试:无参,自定义类型返回值。
   *
   * @return
   */
  Result test1();

  /**
   * 测试:自定义类型参数,无返回值。
   *
   * @param arg
   */
  void test2(Arg arg);

  /**
   * 测试:自定义参数,自定义返回值。
   *
   * @param arg
   * @return
   */
  Result test3(final Arg arg);
}

自定义参数类

package com.yuanxin.paas.ssb;

import java.io.Serializable;

public class Arg implements Serializable {

  private int i;

  public int getI() {
    return i;
  }

  public void setI(int i) {
    this.i = i;
  }

}

自定义返回值类

package com.yuanxin.paas.ssb;

import java.io.Serializable;

public class Result implements Serializable {

  private int i;

  private String string;

  public int getI() {
    return i;
  }

  public void setI(int i) {
    this.i = i;
  }

  public String getString() {
    return string;
  }

  public void setString(String string) {
    this.string = string;
  }

}

Dubbo 配置略。

Node 端

node-hessian

安装 node-hessian:

npm install hessian-proxy

调用服务接口

var Proxy = require('hessian-proxy').Proxy;

var proxy = new Proxy('http://127.0.0.1:9098/test-provider/provider/com.yuanxin.paas.ssb.TestService', '', '', proxy);

proxy.invoke('test', null, function (err, reply) {
  console.log('test: ' + reply);
});

proxy.invoke('test0', [25], function (err, reply) {
  console.log('test0: ' + JSON.stringify(reply));
})

proxy.invoke('test1', null, function (err, reply) {
  if (err) {
    console.log('test1: ' + err);
  }

  console.log('test1: ' + JSON.stringify(reply));
})

var argForTest2 = {
  i: 2
};

argForTest2.__type__ = 'com.yuanxin.paas.ssb.Arg';

proxy.invoke('test2', [argForTest2], function (err, reply) {
  if (err) {
    console.log('test2: ' + err);
  }

  console.log('test2: ' + JSON.stringify(reply));
})

var argForTest3 = {
  i: 3
};

argForTest3.__type__ = 'com.yuanxin.paas.ssb.Arg';

proxy.invoke('test3', [argForTest3], function (err, reply) {
  if (err) {
    console.log('test3: ' + err);
  }

  console.log('test3: ' + JSON.stringify(reply));
})

运行结果

Java 端

Node 端

总结

Dubbo 非常赞,提供了对 Hessian 原生协议的支持;Node 调用起来也非常简单,不过还是有几个点需要注意一下:

  • 接口方法不能重载(接口里的方法必须使用不同的方法名)
  • 自定义类型的命名空间服务端与消费端要一致(com.yuanxin.paas.ssb.Arg)
  • 服务端自定义类型需要实现序列化接口(java.io.Serializable)
  • 尽量使用简单的自定义类型结构(避免嵌套)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中如何动态创建接口的实现方法

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口. 3.spring aop 这是最典型的动态代理了. 创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理. 代理模式是一种常用的设计模式,其目的就是为其他对象提

  • Java成员变量的隐藏(实例讲解)

    一.如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子: public class A { public int x=10; } public class B extends A { public int x=20; } public class C { public static void main(String[] args) { A a=new B(); System.out.println(a.x); //1 B b=new B();

  • Java开发者推荐的10种常用工具

    以下是Java程序员在日常生活中最常用的10种工具.如果你正在使用Java,本文介绍将会对你有所帮助,如果你还不熟悉这些工具,在这里你可以对它们进行更加系统的了解. 1) IDE:Eclipse和NetBeans IDE是Java开发人员最为重要的工具.IDE不仅提供了集成的开发环境,还能够帮助导航.调试和记录代码.Eclipse作为行业领导者,有一半的Java开发人员都在使用它.而在编写测试程序.测试和调试Java web开发的新事物方面,我更推崇Netbeans,这是因为在web开发方面Ne

  • java中设计模式(多例)的实例详解

    java中设计模式(多例)的实例详解 多例:单例设计模式的变形,可以看成是一个缓存池的单例,而缓存池里面可以存多个数据 实例代码: //单例+缓存---没有控制池大小 public class A { //1创建一个单例的池 (private即把池封装成单例了) private static Map<String, A> pool = new HashMap<String, A>(); //池--集合: Map:key-value public synchronized stati

  • 关于Java反射机制 你需要知道的事情

    大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载.Java类如果不被Java虚拟机加载,是不能正常运行的.现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了. Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载.探知.自审.使用在编译期并不知道的类.这样的特点就是反射. 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态

  • java 中设计模式(值对象)的实例详解

    java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设计模式 值对象的本质是"封装数据 具体步骤:  1. 所写的类必须实现序列化Serializable(序列化是为了防止数据读取的时候数据丢失). 同时主要这个类的命名规范.值对象的命名规范: XxxValueObject, XxxVO, XxxModel. 2. 必须要写一个成员变量Id作为主键.(

  • 详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象

  • Node调用Java的示例代码

    Java 端作为服务提供者,基于Dubbo实现服务并通过 Dubbo Hessian 扩展暴露服务:Node 端作为服务消费者,通过node-hessian 调用 Java 端的服务. Java 端 服务接口 package com.yuanxin.paas.ssb; public interface TestService { /** * 测试:无参,无返回值. */ void test(); /** * 测试:原生类型参数与返回值. * * @param i * @return */ Str

  • Java 使用Axis调用WebService的示例代码

    import org.apache.axis.client.Call; import org.apache.axis.client.Service; /** * @ClassName: TestAxis * @Description: TODO(描述这个类的作用) * @author huc * */ public class TestAxis { public static void main(String []args){ String inConditions = "<?xml ve

  • python调用摄像头的示例代码

    一.打开摄像头 import cv2 import numpy as np def video_demo(): capture = cv2.VideoCapture(0)#0为电脑内置摄像头 while(True): ret, frame = capture.read()#摄像头读取,ret为是否成功打开摄像头,true,false. frame为视频的每一帧图像 frame = cv2.flip(frame, 1)#摄像头是和人对立的,将图像左右调换回来正常显示. cv2.imshow("vi

  • C# WinForm调用Shell_NotifyIcon的示例代码

    public class InnerClass: Form { private Shell_NotifyIconEx servicesClass = null; // 接受主CLASS 的实例句柄 internal InnerClass(Shell_NotifyIconEx _servicesClass) { servicesClass = _servicesClass; } private const int WM_LBUTTONDOWN = 0x0201; // 左键 private con

  • Python调用Redis的示例代码

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/8/12 # @Author : Zhang Fan # @Desc : Library # @File : MyRedis.py # @Update : 2019/8/23 # ************************************* import redis class MyR

  • Python封装SNMP调用接口的示例代码

    PySNMP 是一个纯粹用Python实现的SNMP,用PySNMP的最抽象的API为One-line Applications,其中有两类API:同步的和非同步的,都在模块pysnmp.entity.rfc3413.oneliner.cmdgen 中实现,如下是Get方式与Walk方式的基本实现. 首先需要在系统中安装SNMP客户端,对于Linux平台来说只需要执行如下配置过程即可. [root@localhost ~]# yum install -y net-snmp [root@local

  • node文字生成图片的示例代码

    今天老板提了需求,要在服务端生成邀请卡,嗯-,简单的说就是把要这张: 变成差多这样的: 后端搞ruby的哥们搞了个html转图片,说转得太慢了,我就把这坑接下来了 所以睡前就倒腾了下,搞了个简单的实现 解决思路 文字转svg -> svg转png -> 合并图片 相关轮子 images Node.js 轻量级跨平台图像编解码库,不需要额外安装依赖 text-to-svg 文字转svg svg2png svg转png图片 示例代码 'use strict'; const fs = require

  • jQuery调用RESTful WCF示例代码(GET方法/POST方法)

    不废话了,直奔主题吧 wcf端: 近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即: <%@ ServiceHost Language="C#" Debug="true" Service="ajaxSample.HelloWorld" CodeBehind="HelloWorld

  • 实战node静态文件服务器的示例代码

    本篇文章主要介绍了实战node静态文件服务器的示例,分享给大家,具体如下: 支持功能: 读取静态文件 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出文件列表 MIME类型支持 缓存支持/控制 支持gzip压缩 Range支持,断点续传 全局命令执行 子进程运行 1. 创建服务读取静态文件 首先引入http模块,创建一个服务器,并监听配置端口: const http = require('http'); const server = http.create

  • Nodejs调用WebService的示例代码

    这两天一直在试着编写纯静态页面的js去调用由Java编写的WebService,一直无法成功(主要工期比较赶,待后面比较闲的时候再来研究,看能不能写一个纯静态页面的js去调用WebService的),最后 没有办法只有改成Node JS去调用WebService.本想在网上找一些资料,发现没有让人满意的,最后还是只能去参考官网的文档,结合自己的需求做了一个Client端的程序,希望对大家有所帮助. 首先来做前期准备工作,假设你已经安装了nodejs,因为我没有通过工程来设置,直接通过命令来实现,

随机推荐