我们在实际的生产、开发实践中,其实要和许多第三方服务商进行打交道,这其中包括使用他们提供的批量与联机服务,但与别的互联网企业不大相同的是,银行作为传统企业,其一贯重视安全性,许多在互联网企业看似理所当然的事情,在银行内实践起来就不那么顺畅。比如,最近,因为第三方系统升级(升级改造的原因自然是因为国家监管、政策性要求、保密性要求,否则像XXX第一大行这样的企业,强势是他一贯的作风),导致我们调用服务也需要配合改造,这里面涉及某一个请求字段的加解密,对方提供了一个jar包,明确说明后续升级可能只需要更新jar包即可。而我们整个系统是.net实现的,但因涉及联机字段转换,这个看似简单,其实就要想点心思去想怎么实现以及后续的便捷升级。三种方案:

  a.通过IKVM将这个Jar包转换为DLL,然后很方便的去引用,问题是后续升级可能相对比较麻烦。
  b.生产上服务器部署WAS或者Tomcat,你只需要基于此Jar包开发一个简单的http接口,问题是代价太大,增加运维负担。
  c.基于Node.js开发一个简单的HTTP接口。

  我来模拟一个jar包,接口调用我用System.out输出,这样在Node.js中可以比较方便的调用。

import java.io.UnsupportedEncodingException;
import java.util.Base64;
public class Test { public static void main(String[] args) throws UnsupportedEncodingException {
if(args!=null&&args.length == 1){
System.out.print(toParse(args[0]));
}else{
System.out.print("Wrong Args");
}
} static String toParse(String str){
return Base64.getUrlEncoder().encodeToString(str.getBytes());
}
}

  然后这里写js代码,就是这个样子,其实就是Node.js中的child_process调用执行这个jar包,注意刚才说了jar包中方法输出用System.out,看下面的exec回调函数中stdout可以访问:

function parserequest(info,res){
logger.debug(info);
var exec = require('child_process').exec, child;
var exec_path = "java -jar Test.jar " + info.id ;
var data;
child = exec(exec_path,function (error, stdout, stderr){
logger.debug(stdout); data = "{errcode:0,errmsg:'" + stdout +"'}"
res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8;'});
res.end(JSON.stringify(data)); if(error !== null){
logger.debug('stderr: ' + stderr);
logger.debug('exec error: ' + error);
data = "{errcode:500,errmsg:'" + error + "'}"
res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8;'});
res.end(JSON.stringify(data));
}
});
}

  部署之后,我们通过页面直接访问,初步看下是否是我们想要的结果,之后在我们的系统中直接HTTP调用,解析JSON字段就可以了。

  借用《吐槽大会》池子的话,知识点有没有:Node.js中日志log4js,npm安装之后里面有示例代码,就是下面这样:

var log4js = require('log4js');

log4js.configure({
appenders: [
{
type: "file",
filename: "test.txt",
category: [ 'test','console' ]
},
{
type: "console"
}
],
replaceConsole: false
}); var logger = log4js.getLogger('test');
logger.setLevel('debug');

  JSON处理之Node.js中的JSON2,npm装之后

  Node.js调用jar,涉及Node.js中child_process接口,比如这里

logger.debug(info);
var exec = require('child_process').exec, child;
var exec_path = "java -jar Test.jar " + info.id ;

  就这么愉快的结束了!

文章来源:https://blog.csdn.net/kangkanglou/article/details/69274818

NodeJS调用jar包的更多相关文章

  1. Unity调用Android的两个方式:其一、调用jar包

    unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...

  2. Loadrunner11.0调用Jar包

    又好几天不写东西了,是不是意味着最近没有大的进步,时时敲打自己. 今天把loadrunner如何调用Jar包搞定了,现在把配置的过程中需要注意的东西写下来,分享给小伙伴儿,减少他们在前行路上的弯路. ...

  3. html实现调用jar包

    整体思路:html引用URL protocol-本地注册表key,key对应某一c#写的exe可执行文件,由exe可执行文件调用cmd,cmd执行jar包. 1.添加注册表: Windows Regi ...

  4. winform调用jar包

    因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接口采用http连接,采用JSON-RPC轻量级远程调用协议.所以决定用winform做一个管理界面(其中还包括其他的功能),java完成数据 ...

  5. (转载)Python 的 JPype 模块调用 Jar 包

    Python 的 JPype 模块调用 Jar 包 背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接 ...

  6. Python调用jar包中的方法

    [本文出自天外归云的博客园] 需求 最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁.因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意.最后转换思路 ...

  7. 如何制作Jar包并在android中调用jar包

    android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...

  8. jmeter 调用jar包 本地加密

    1.因为加密接口是有我们自己加密方式,所有加密包由开发提供,获得加密包后方式jmeter目录/lib/ext文件夹中 2.选择引入加密包 3.添加BeanShell Sampler和Debug Sam ...

  9. python实战===用python调用jar包(原创)

    一个困扰我很久的问题,今天终于解决了.用python调用jar包 很简单,但是网上的人就是乱转载.自己试都不试就转载,让我走了很多弯路 背景:python3.6 32位   + jre 32位  +  ...

随机推荐

  1. 删除map、list集合元素总结

    @Testpublic void removeElementFromMap(){Map<Integer, String> test = new HashMap<Integer, St ...

  2. 使用Xcode 7 beta免费真机调试iOS应用程序

    使用Xcode 7 beta免费真机调试iOS应用程序 六月 9, 2015  |   K-Res 发布   今天凌晨的WWDC15虽然没有熬夜守候吧,但也还是早起第一时间翻看了twitter的相关标 ...

  3. 如何使用linq读取DataTable集合?AsQueryable() 和 AsEnumerable()区别?

    一.准备工作 引入linq和data 相关的using命名空间 DataTable dt=new DataTable();//dt的来源可以是多个地方,比如:数据库,Excel等等.我这里使用Exce ...

  4. 4.C#WebAPI多版本管理介绍及实现方案详解

    1.什么是 API 的多版本? 说白了就是多版本共存的问题.为方便大家理解我就举个例子吧,大家想必都用过Jquery吧,它的1.*版本做到了对低版本IE的支持:2.*版本还保留着ajax,但是不再支持 ...

  5. C#存储过程调用的三个方法

    //带参数的SQL语句 private void sql_param() { SqlConnection conn = new SqlConnection("server=WIN-OUD59 ...

  6. easyui datagrid sort 表头 排序

    datagrid的点击列表头刷新,分为两种,一种是页面刷新,不涉及后台服务器数据,不会从新查询数据库,只会刷新当前页数据: 一种是服务器级刷新,会重新加载全部数据. 如果不需要自定义排序,可以直接使用 ...

  7. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  8. 一步一步学习Swift之(二):好玩的工具playground与swfit基础语法

    playground好于在于能一边写代码一边看到输出的常量变量的值.不需要运行模拟器. 我们来试一下该工具的用法. 打开xcode6开发工具,选择Get started with a playgrou ...

  9. jsp的九大内置对象(查询资料,搬砖所得)

    此笔记大部分摘自大神https://www.cnblogs.com/SimonHu1993/,部分通过网上搜寻补充. 1.Request内置对象(类型:HttpServletRequest    表示 ...

  10. FunDA(5)- Reactive Streams:Play with Iteratees

    FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...