java实现云函数(Groovy)

162 阅读2分钟

简介

Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。

特点

  • 是一个基于 Java 虚拟机的敏捷动态语言
  • 构建在强大的 Java 语言之上 并添加了从 Python、Ruby 和 Smalltalk 等语言中学到的诸多特征
  • 为 Java 开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
  • 支持 DSL(Domain Specific Languages 领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
  • Groovy 拥有处理原生类型,面向对象以及一个 Ant DSL ,使得创建 Shell Scripts 变的非常简单。
  • 在开发 Web,GUI,数据库或控制台程序时 通过减少框架性代码 大大提高了开发者的效率。
  • 支持单元测试和模拟(对象),可以简化测试
  • 无缝集成 所有已经存在的 Java 对象和类库
  • 直接编译成 Java 字节码,这样可以在任何使用 Java 的地方使用 Groovy 。

引入

<!-- groovy -->
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>3.0.10</version>
    <type>pom</type>
</dependency>

package com.seagull.oa.groovy;

import groovy.lang.GroovyClassLoader;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.quartz.Job;

import com.alibaba.fastjson.JSONObject;
import com.seagull.oa.common.ResultData;
import com.seagull.oa.util.SpringContextUtils;
import com.seagull.oa.util.VerifyHandlerResult;

public class GroovyFactory {

    private static GroovyFactory groovyFactory = new GroovyFactory();

    private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();

    public static GroovyFactory getInstance() {
        return groovyFactory;
    }


    /**
     * 根据脚本内容生成ICloud的实现
     *
     * @param script
     * @param method
     * @return
     * @throws Exception
     */
    public ResultData getICloudFromCode(String script, String method, Map<String, Object> params) throws Exception {
        Class<?> clazz = groovyClassLoader.parseClass(script);
    	Method execute = clazz.getMethod(method, Map.class);
        Object instance = clazz.newInstance();
    	SpringContextUtils.autowireBean(instance);
    	Object ret = execute.invoke(instance, params);
        groovyClassLoader.clearCache();
        return (ResultData) ret;
    }
}


@Transactional
    @RequestMapping("/{path}/{method}")
    public ResultData authority(@PathVariable String path, @PathVariable String method, @RequestParam Map<String, Object> params) {
    	Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
    	try {
        	 // 从数据库或者缓存获取代码
            String script = metaFunctionService.queryByPath(path);
            if (!StringUtils.isEmpty(script)) {
            	return GroovyFactory.getInstance().getICloudFromCode(script, method, params);
            } else {
                return ResultData.warn(ResultCode.OTHER_ERROR, "路径错误");
            }
        } catch (InvocationTargetException e) {
        	TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
			e.getTargetException().printStackTrace();
			return ResultData.warn(ResultCode.INTERNAL_SERVER_ERROR, e.getTargetException().getMessage());
		} catch (Exception e) {
			TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
			e.printStackTrace();
			return ResultData.warn(ResultCode.INTERNAL_SERVER_ERROR, e.getMessage());
		}
    }

@Component
public class SpringContextUtils implements ApplicationContextAware {

	static ApplicationContext context;

	@Override
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		SpringContextUtils.context = context;
	}

	public static ApplicationContext getContext() {
		return context;
	}

	public static void autowireBean(Object bean) {
		context.getAutowireCapableBeanFactory().autowireBean(bean);
	}

	public static <T> T getBean(Class<T> clazz) {
		return context.getBean(clazz);
	}

}