1. 程式人生 > >使用zabbix的java api來對主機進行刪除時的bug說明

使用zabbix的java api來對主機進行刪除時的bug說明

在最近的程式碼開發中,通過java呼叫zabbix的api來實現對主機(host)的刪除(host.delete
),問題出現在當在程式碼中傳入hostid的時候,請求傳送異常,異常資訊是no permission什麼的(沒截圖,手動求原諒)。找了一下午,終於找到了原因

<dependency>
    <groupId>com.github.0312birdzhang</groupId>
    <artifactId>Zabbix4j</artifactId>
    <version>0.1.8</version>
</dependency>

2,說重點,因為公司的zabbix伺服器是3.0版本的,而大神封裝好的jar包是基於zabbix1.8版本的。這也是我在開發中遇到的bug之一,詳情如下:

{
    "jsonrpc": "2.0",
    "method": "host.delete",
    "params": [
        "13",
        "32"
    ],
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

這裡可以看出在params內部傳入的host的id值即可,但是藉助jar包幫助我們生成的json格式如下:

{
    "jsonrpc": "2.0",
    "method": "host.delete",
    "params": [
        "hostid":"13",
        "hostid":"32"
    ],
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

那麼在傳送請求的時候就會報出錯誤:no permission…….

3,原因找到了,解決辦法就有了,在jar包中找到了傳送host.delete請求的封裝json資料的程式碼,貼出程式碼:

public class HostDeleteRequest extends ZabbixApiRequest {
    private List<Params> params = new ArrayList<Params>();

    public HostDeleteRequest() {
        setMethod("host.delete");
    }
    public List<Params> getParams() {
        return params;
    }
    public void setParams(List<Params> params) {
        this.params = params;
    }
    public void addParams(int hostid) {
        this.params = ZbxListUtils.add(this.params, new Params(hostid));
    }
    public class Params {
        private Integer hostid;
    public Params(Integer hostid) {
        this.hostid = hostid;
    }
        public Params() {
        }
    }
}

可以看出這個類將我們需要刪除的hostid封裝成了一個Params物件,因此在傳送json的時候顯示
的是 “hostid”:”234” 這種格式。
解決辦法有兩種:

一種是將原始碼包下載下來,將List< params > 更改為 List < Integer >。然後打成新jar包放在專案中即可

一種就是仿照這個HostDelteRequest類,自己重新寫一個類,不過將引數List< params > 改為 List<Integer>,然後傳送json的時候引用這個類就可以了。(這種方式需要更改兩個檔案,比較麻煩,推薦使用第一種)

這兩種更改方式表明我們傳送的json資料是基本型,不是物件。