5.1.JavaSDk · GitBook

5.1.JavaSDk

[TOC]

maven依赖

<dependency>
    <groupId>bsip</groupId>
    <artifactId>stone-sdk</artifactId>
    <version>siprs1.2-SNAPSHOT</version>
</dependency>

spring配置

<!-- 引用rabbitmq连接-->
<bean id="mqFactory" class="bsip.rabbitmq.factory.MqFactory">
        <property name="host" value="mqserver"/>
        <property name="port" value="5672"/>
        <property name="managerPort" value="15672"/>
        <property name="username" value="bsip"/>
        <property name="password" value="pass@sip#123"/>
    </bean>

<!-- 引用StoneLauncher-->
<bean id="jobLauncher" class="bsip.stone.sdk.launcher.StoneLauncher">
        <property name="factory" ref="mqFactory"></property>
        <property name="serviceCode" value="test_resource_manager"/>
        <property name="serviceName" value="测试资源服务"/>
        <property name="serviceDescription" value="this service is for test"/>
    <!-- 全局配置业务属性,全局属性配置和局部属性配置只能使用一种,如果配了两种,以全局配置为优先-->
        <property name="businessKey" value="regionId"></property>
        <property name="businessValue" value="beijin"></property>
        <!-- 局部配置业务属性-->
        <property name="businessKeys">
            <props>
                <!-- 对指定的stone配置业务属性-->
                <prop key="createVolume">regionId</prop>
            </props>
        </property>
        <property name="businessValues">
            <props>
                <prop key="createVolume">beijin</prop>
            </props>
        </property>
        <!-- stone线程数量-->
        <property name="multyConsumer" value="5"/>
</bean>

开发StoneBean

注解说明

通过注解的方式,配置StoneBean,每一个StoneBean会声明一个Stone。

  • Stone : 注解一个Bean为StoneBean。
    • code: 编号,也是队列名称,必填
    • displayName:显示名称,显示在执行器列表和设计器中
    • description:描述信息,说明Stone的功能
    • ack:是否在函数运行完成后,应答消息服务(某些场景下,可以异步应答消息服务)
    • complete: 是否在函数运行完成后,向引擎发送完成事件
    • exchangeType : 默认为direct,消息的类型,一般不必修改
    • routingKey : 默认为空,一般不必修改
    • multy : Stone对应的消费者数量,也可在Spring中配置,以Spring配置优先
    • signle :如果为true,则无论Spring中是否配置multy,只启动一个线程的消费者
    • businessKey:根据业务属性,不同的消费者,处理不同业务的逻辑
    • cron : 时间表达式,一旦设置后会在满足条件下,才会执行进程
  • StoneParam:用注解的形式,配置Stone的参数
    • Name : 参数标示
    • DisplayName : 参数名称,如果为空,则取参数的name
    • Description : 描述信息
    • Type : 参数类型
    • Default : 默认值
    • NoEcho : 是否明文
    • AllowedValues : json数组
    • AllowedPattern : 允许的正则表达式
    • MaxLength : 最大长度
    • Minlength : 最小长度
    • Visible : Visible为true的参数,允许设计者在设计器中可见,默认为false
  • StoneOutput : 用注解的形式,配置Stone的输出
    • Name : 参数标示
    • Description : 描述信息

实现接口

IAsycStone

支持异步操作,以及回滚和删除,一般实现这个接口即可。

public interface IAsycStone {
    /**
     * 开始工作
     * @param var1
     */
    void startWork(TaskInfo var1);

    /**
     * 异步查询工作进度
     * @param var1
     */
    void asyncWorking(TaskInfo var1);

    /**
     * 回滚
     * @param var1
     */
    void rollback(TaskInfo var1);

    /**
     * 流程删除动作
     * @param var1
     */
    void delete(TaskInfo var1);
}
ICancelStone

支持取消操作,如流程取消时,不需要响应,则无需实现。

public interface ICancelStone {

    /**
     * 流程取消动作
     * @param var1
     */
    void cancel(TaskInfo var1);
}
IMockStone

支持模拟操作,如流程不需要响应模拟事件,则无需实现。模拟事件,可以用在计费计量的预测上。

public interface IMockStone {
    /**
     * 流程模拟动作
     * @param var1
     */
    void mock(TaskInfo var1);

}

实现样例

@Stone(code = "createInstanceTest",description = "create an instance")
@StoneParam(Name = "vpcId",Type = "String",Description = "need a vpc where create instance in.",  Visible= true)
@StoneParam(Name = "amiId",Type = "String",Description = "need a ami-id where create instance in.",Visible = true)
@StoneParam(Name = "zoneId",Type = "String",Description = "need a ami-id where create instance in.",Visible = true)
@StoneOutput(Name = "instanceId",Description = "the instance'id ")
public class AsycInstanceCreater extends BaseService implements IAsycStone ,ICancelStone,IMockStone {
    @Override
    public void startWork(TaskInfo taskInfo) {
        System.out.println(taskInfo.getString("vpcId"));
        taskInfo.addOutput("regionId", taskInfo.getNamespace()+"ceshi");
    }

    @Override
    public void asyncWorking(TaskInfo taskInfo) {
        taskInfo.addOutput("value", ImmutableMap.of("instance" ,taskInfo.getNamespace()+"__instance"));
        taskInfo.addOutput("regionId", taskInfo.getNamespace()+"ceshi");
        taskInfo.addOutput("instanceId", taskInfo.getNamespace()+"ceshi");
    }

    @Override
    public void rollback(TaskInfo taskInfo) {
        System.out.println("rollback for instance:"+taskInfo.get("value"));
        System.out.println("rollback instance successed!!!");
    }

    /**
     * 流程删除动作
     * @param var1
     */
    @Override
    public void delete(TaskInfo var1) {
    }

    /**
     * 流程取消动作
     * @param var1
     */
    @Override
    public void cancel(TaskInfo var1) {
    }

    /**
     * 流程模拟动作
     * @param var1
     */
    @Override
    public void mock(TaskInfo var1) {
    }
}

函数的入参为taskInfo,可以从中获取到相关信息。

taskInfo.getString("vpcId"); // 获取参数
taskInfo.getInt("size");
taskInfo.getProcessInstanceId(); // 获取processInstanceId
taskInfo.getNamespace(); // 获取作用域信息

函数的输出:

taskInfo.addOutput("regionId", taskInfo.getNamespace()+"ceshi");

函数的完成:

taskInfo.failed("running failed"); // 默认为成功,否则,须设置为失败

消息队列

队列名称一般为code.method,例如createInstance.cancel. createInstance表示运行start方法,method为start的时候,不会加method后缀。

createInstance.monitor,代表着执行createInstance的asyncWorking方法。

有些执行器需要根据不同的业务去运行,比如受网络调用的影响,负责调用北京区的服务模块,只能接受北京的服务请求,因为上海的服务模块,网络无法连通。

队列的名称为business_key.code.method,例如beijin.createInstance.cancel,代表着执行business_key为beijin的createInstance的cancel方法。

img