OSGI中自定义command(2)

OSGI中自定义command(2)


前文

在上一篇博文中,我们讲述了什么是OSGI中的command,同时写了一个简单的command,这个command实现了org.apache.felix.gogo.commands.Action这个接口,同样可以实现相同功能的还有

org.apache.karaf.shell.console.OsgiCommandSupport这一个抽象类,但是在本程序中,这两个接口或者抽象类上都标注了@Deprecated,因此已经不推荐使用了,而当前推荐使用的则是karaf中的一个接口,为org.apache.karaf.shell.api.action.Action,但是这个在使用过程中会出现一定的问题,这个稍后再说,本文主要讲解的是,不再使用karaf提供的@Service,@Command和继承或者实现相关接口来编写Command,而是在blueprint.xml的方式配置一个Command,这个文字不太好描述,下面就直接用相关程序来讲解本次编写的command。


自定义command

首先不多说,新建一个类,命名为SampleCommand,里面分别写三个方法,两个无参方法,一个有参,为以下:

    public void first() {
        System.out.println("first");
    }

    public void second() {
        System.out.println("second");
    }

    public void hello(String name) {
        System.out.println("hello " + name);
    }

以上,等会再控制台中显示,上述两个无参方法,就是普通命令,而有参方法则是可以传入一个参数,并且会在控制台中打出,在以上完成之后,还要在blueprint.xml中配置相关命令,blueprint.xml中内容如下:

<bean class="cn.com.files.command.SampleCommand" id="sampleCommand"/>
    <service auto-export="all-classes" ref="sampleCommand">
        <service-properties>
            <entry key="osgi.command.scope">
                <!-- define the prefix for you commands -->
                <value>sample</value>
            </entry>
            <entry key="osgi.command.function">
                <!-- declare the list of all the methods you want to expose -->
                <array value-type="java.lang.String">
                    <value>first</value>
                    <value>second</value>
                    <value>hello</value>
                </array>
            </entry>
        </service-properties>
    </service>

我们首先进行了一个bean的配置,即将SampleCommand配置为bean,其次我们配置了一个service,并在osgi.command.scope中的value中指定值为sample,这就是我们先前写的scope,而在指定的osgi.command.function中指定的数组中的值,即为我们编写的几个方法名,如此配置完成之后,我们的command就基本完成了,现在只需要重新在控制台mvn clean install -U -DskipTests之后,再次打开karaf的控制台,观察当前bundle的启动状态,以及我们编写的command。


运行

打开karaf控制台,输入list,bundle运行状态如下所示:

其中ID为13的,name为Storage的这一个state为Active,说明Bundle正常启动,现在尝试运行我们编写的命令,输入sample,这是我们之前定义的scope,按下tab键,有以下提示:

在提示中,三个方法依次提示出来,我们执行sample:first,sample:second都将会在控制台中打出内容,如下所示:

以上依次执行我们方法中的内容,现在开始我们的方法3即sample:hello,在输入以上命令后,按下tab键,此时并没有什么提示,但是我们却是需要输入一个参数,这个提示在上一篇中的command的定义方法,并指定一个参数,并编写相关方法后确实是有提示的这个稍后再提,在我们输入sample:hello world后,控制台打出的内容为:

如此,带有参数的命令也正常执行了。


其他实现

其实在实现带有参数的命令中,还有另外一种实现,在此可以说一下,这里提供了另外一种注解,即为@Argument,将这个加在我们在命令中的参数上,就像是以下这样:

@Argument(index = 0, name = "arg", description = "the command argument", required = false, multiValued = false)
String arg;

然后还需要一个completer类,在这作为对参数的提示,我编写的如下所示:

/**
 * Created by xiaxuan on 16/7/6.
 * a simple Completer
 */
public class SimpleCompeter implements Completer {

    public int complete(String buffer, int cursor, List<String> candidates) {
        StringsCompleter delegate = new StringsCompleter();
        delegate.getStrings().add("one");
        delegate.getStrings().add("two");
        delegate.getStrings().add("three");
        return delegate.complete(buffer, cursor, candidates);
    }
}

同时还需在blueprint.xml中的命令中配置相关的completer,如下:

<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
        <command name="test/args">
            <action class="cn.com.files.command.ArgsCommand">
            </action>
            <completers>
                <ref component-id="simpleCompleter"/>
                <null/>
            </completers>
        </command>
    </command-bundle>

如此也是完成了一个带有参数的命令,但是问题在于,我在karaf控制台中执行这个命令的时候,按下tab键的时候确实是有相关的提示,就是我们在completer中编写的one、two、three。但是输入其中任何一个,在控制台中输出的始终是null,我在看karaf源码的时候,karaf中的任意一个模块基本都是使用了大量的命令,我使用的方法和他们的类似,但是输出却是出了一定的问题,这个如果有过研究的人希望能与我探讨一下这个问题。


总结

  • 其实这种命令,在更多上,是属于自己的扩展,应用于制作第三方的客户端的较多,在平常应用的编写中,这种command编写的还是比较少,因为在生产环境中,多半已经把ssh登录限制了,所以基本不可能远程登录karaf控制台来执行自己的命令。
  • 在命令的使用上,更多还是使用后续讲解这一种命令较好,这种官方提供更多的支持,并且提供了许多种注解可以使用,可以加上@Argument,@Option等等。
  • 命令更多的只是对我们的应用程序的一种辅助,在真正的生产环境中,建议还是不要大量的运用这种命令,该用接口的还是使用接口实现。
时间: 2024-08-03 10:27:15

OSGI中自定义command(2)的相关文章

SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession

1.      创建自定义类MySession,继承AppSession类并重写AppSession类的方法 注:一个AppSession对象对应一个连接 [csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Linq; using System.Text; using SuperSocket; using SuperSocket.Common; using Super

# OSGI中使用自定义的command

OSGI中command的应用 前文 在上一篇博文中,我们讲解了osgi中的blueprint,但并没有对此作出具体的运用,在本文及以后将会在讲osgi中其他应用的时候将blueprint串进来讲解,本文将要讲讲解的是osgi中的command,在编写的应用中,可能涉及到数据迁移或者其他一些操作,如果这个通过调用接口来进行操作的话,如果非相关人员获取到相关接口调用方式,可能会带来一些危害,所以在不得已的情况下不会使用接口的方式,这个时候command的作用就体现出来了,如果自己编写数个命令,然后

OSGI中blueprint简介

OSGI中blueprint简介 上篇博文我们开始了felix中的一个example编写,原本计划是讲felix中的几个example全部编写一遍,但是随后发现felix的这几个example都差不多,只是略微有些区别,编写来编写去始终都是这几行代码,讲起来也没什么意思,想着还是开始osgi中新的东西的讲解,思考来去,还是从blueprint开始. blueprint简介 在osgi中服务的使用有多种方式,如使用传统的注册式服务,就是我们之前中example不断使用的使用方式,还是osgi中的声

CentOS 7 中自定义nagios 插件脚本

一. 系统环境 操作系统:CentOS 7 nagios 服务器端版本:nagios-4.0.8-2.el7.x86_64 nrpe  客户端版本:nrpe-2.15-7.el7.x86_64 二.nagios自定义插件返回码:      Return Code     Service State     Host State        0                   OK                  UP        1                   WARNING 

vue中自定义指令

在vue中自定义标签,首先要调用vue中一个directive的方法,具体方法:Vue.direction('指令名称',function(){ }); 例如我们要写一个关于颜色的指令,叫v-colorred: 1 Vue.directive('colorred',function(){ 2 3 this.el.style.color='red'; 4 }); 在html中,我直接用v-colorred指令就可以了,例如: 1 <p v-colorred>1234567890</p>

在Tableau中自定义版块地图 (Polygon)

在Tableau的地图报表中有一个‘Filed Map’的类型,可以根据版块来显示数据. 但实际应用中Tableau固有的版块划分可能不是我们想要的,下面介绍如何自定义版块并且用作数据分析. 自定义版块 在Tableau中自定义版块是非常容易的.如下图我们把每个点链接起来就是一个多边形的版块 上面的经纬度就不用说了.State 是我们版块的名字.其中Point Order告诉Tableau链接的顺序. Polygon ID 用来指定各个闭合的区域.如下图,State 都叫Michigan,由两块

linux中自定义回收站

myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "[email protected]" $D && echo "moved to $D ok"; } [[email protected] test]# myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D;  mv "[email protected]" $D &&am

PB中自定义事件ID含义

PB中自定义事件ID含义 单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetcheck 单选按钮或多选按钮是否被选. pbm_bmgetstate 按钮是否加亮. pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然. pbm_bmsetstate 加亮或不加亮按钮. pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框. 单选或多选按钮通知消息(前缀:pbm_bn) pbm_bnclicked 按钮控件被点中. pbm_bndisable

对NSArray中自定义的对象进行排序

本文译自How to sort NSArray with custom objects. 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天程序则又一个Friend类,点菜程序会有一个Recipe类等.有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行