Jelajahi Sumber

upgrade go-mod-messaging to v3

Signed-off-by: Rui-Gan <1171530954@qq.com>
Rui-Gan 2 tahun lalu
induk
melakukan
4260e16c52

+ 0 - 6
etc/connections/connection.yaml

@@ -55,12 +55,6 @@ edgex:
     optional:
       KeepAlive: "50"
 
-  zeroMsgBus: #connection key
-    protocol: tcp
-    server: localhost
-    port: 5571
-    type: zero
-
   natsMsgBus: #connection key
     protocol: tcp
     server: edgex-nats-server

+ 4 - 4
etc/sources/edgex.yaml

@@ -26,12 +26,12 @@ default:
 #    SkipCertVerify: true/false
 
 #Override the global configurations
-zmq_conf: #Conf_key
-  protocol: tcp
+redis_conf: #Conf_key
+  protocol: redis
   server: localhost
-  port: 5563
+  port: 6379
   topic: events
-  type: zero
+  type: redis
   messageType: event
 
 application_conf: #Conf_key

+ 11 - 10
go.mod

@@ -8,8 +8,8 @@ require (
 	github.com/benbjohnson/clock v1.3.0
 	github.com/dop251/goja v0.0.0-20230226152633-7c93113e17ac
 	github.com/eclipse/paho.mqtt.golang v1.4.2
-	github.com/edgexfoundry/go-mod-core-contracts/v2 v2.3.0
-	github.com/edgexfoundry/go-mod-messaging/v2 v2.3.0
+	github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0-dev.35
+	github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0-dev.21
 	github.com/fxamacker/cbor/v2 v2.4.0
 	github.com/gdexlab/go-render v1.0.1
 	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
@@ -20,9 +20,8 @@ require (
 	github.com/gorilla/mux v1.8.0
 	github.com/jhump/protoreflect v1.15.0
 	github.com/keepeye/logrus-filename v0.0.0-20190711075016-ce01a4391dd1
-	github.com/klauspost/compress v1.15.11
+	github.com/klauspost/compress v1.16.0
 	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
-	modernc.org/sqlite v1.21.1
 	github.com/mitchellh/mapstructure v1.5.0
 	github.com/montanaflynn/stats v0.7.0
 	github.com/msgpack-rpc/msgpack-rpc-go v0.0.0-20131026060856-c76397e1782b
@@ -39,6 +38,7 @@ require (
 	google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8
 	gopkg.in/ini.v1 v1.67.0
 	gopkg.in/yaml.v3 v3.0.1
+	modernc.org/sqlite v1.21.1
 )
 
 require (
@@ -56,10 +56,12 @@ require (
 	github.com/felixge/httpsnoop v1.0.3 // indirect
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
-	github.com/go-playground/validator/v10 v10.11.2 // indirect
+	github.com/go-playground/validator/v10 v10.12.0 // indirect
 	github.com/go-redis/redis/v7 v7.3.0 // indirect
 	github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/hashicorp/errwrap v1.0.0 // indirect
+	github.com/hashicorp/go-multierror v1.1.1 // indirect
 	github.com/huandu/xstrings v1.4.0 // indirect
 	github.com/imdario/mergo v0.3.13 // indirect
 	github.com/jonboulle/clockwork v0.2.2 // indirect
@@ -87,12 +89,12 @@ require (
 	github.com/spf13/cast v1.5.0 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
 	github.com/yuin/gopher-lua v1.1.0 // indirect
-	golang.org/x/crypto v0.6.0 // indirect
+	golang.org/x/crypto v0.7.0 // indirect
 	golang.org/x/mod v0.8.0 // indirect
-	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/net v0.8.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.5.0 // indirect
-	golang.org/x/text v0.7.0 // indirect
+	golang.org/x/sys v0.6.0 // indirect
+	golang.org/x/text v0.8.0 // indirect
 	golang.org/x/tools v0.6.0 // indirect
 	lukechampine.com/uint128 v1.2.0 // indirect
 	modernc.org/cc/v3 v3.40.0 // indirect
@@ -101,7 +103,6 @@ require (
 	modernc.org/mathutil v1.5.0 // indirect
 	modernc.org/memory v1.5.0 // indirect
 	modernc.org/opt v0.1.3 // indirect
-	modernc.org/sqlite v1.21.1 // indirect
 	modernc.org/strutil v1.1.3 // indirect
 	modernc.org/token v1.0.1 // indirect
 )

+ 27 - 21
go.sum

@@ -53,10 +53,10 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
 github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.3.0 h1:8Svk1HTehXEgwxgyA4muVhSkP3D9n1q+oSHI3B1Ac90=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.3.0/go.mod h1:4/e61acxVkhQWCTjQ4XcHVJDnrMDloFsZZB1B6STCRw=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.3.0 h1:aZfDYjj6n2Lo1P1t6NKuShhHjzFk9/mQV9nuJS3ioZ4=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.3.0/go.mod h1:5pFRG0iJ64ulFdvwYMbnyD94ciS+Va4h3bpK2P4CBk0=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0-dev.35 h1:XQgLXhpZ03JJAz4BvH371jQvFmiWcRI9wS90rE/PtS8=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0-dev.35/go.mod h1:1YS2J5NfPCd7TYBk0alu+RR5EBzBb+bnG0KF1qNRQYY=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0-dev.21 h1:MfTckIw5zlJ6CQCy43nPO8L4P98l0Sw4y2EVxtpoGgg=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0-dev.21/go.mod h1:1YN4ZbgyUSPzdgFjoa2jAyxSMxThyXfUfexcoAIkdk0=
 github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
 github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
@@ -72,8 +72,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
 github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
 github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
 github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
-github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
+github.com/go-playground/validator/v10 v10.12.0 h1:E4gtWgxWxp8YSxExrQFv5BpCahla0PVF2oTTEYaWQGI=
+github.com/go-playground/validator/v10 v10.12.0/go.mod h1:hCAPuzYvKdP33pxWa+2+6AIKXEKqjIUyqsNCtbsSJrA=
 github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
 github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
 github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
@@ -91,6 +91,7 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -101,6 +102,10 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
@@ -119,8 +124,8 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/keepeye/logrus-filename v0.0.0-20190711075016-ce01a4391dd1 h1:JL2rWnBX8jnbHHlLcLde3BBWs+jzqZvOmF+M3sXoNOE=
 github.com/keepeye/logrus-filename v0.0.0-20190711075016-ce01a4391dd1/go.mod h1:nNLjpEi4xVFB7358xLPpPscdvXP+pbhiHgSmjIur8z0=
-github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c=
-github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
+github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
+github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
@@ -137,10 +142,9 @@ github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkL
 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
 github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
 github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
-github.com/logoove/sqlite v1.15.3 h1:Fxg4zIaJMqIRqEiEBMVC0UEtNp0Ul5a+ibFPzAHOGG8=
-github.com/logoove/sqlite v1.15.3/go.mod h1:MRpE/o3qQhT7AgfIdnBue5c63+//xT+KXV0gHeVAUAg=
 github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
@@ -164,7 +168,7 @@ github.com/msgpack-rpc/msgpack-rpc-go v0.0.0-20131026060856-c76397e1782b/go.mod
 github.com/msgpack/msgpack-go v0.0.0-20130625150338-8224460e6fa3 h1:6pY2f1fJC+u27cqhH0sPkXRquVmGF0VOkLKqraRMYfg=
 github.com/msgpack/msgpack-go v0.0.0-20130625150338-8224460e6fa3/go.mod h1:jDCQZQaHCHpBYqM4WoGyujFc55bazGAEwK27iK4PQTI=
 github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI=
-github.com/nats-io/nats-server/v2 v2.9.3 h1:HrfzA7G9LNetKkm1z+jU/e9kuAe+E6uaBuuq9EB5sQQ=
+github.com/nats-io/nats-server/v2 v2.9.15 h1:MuwEJheIwpvFgqvbs20W8Ish2azcygjf4Z0liVu2I4c=
 github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ=
 github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA=
 github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8=
@@ -195,8 +199,8 @@ github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDO
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/rwtodd/Go.Sed v0.0.0-20210816025313-55464686f9ef/go.mod h1:8AEUvGVi2uQ5b24BIhcr0GCcpd/RNAFWaN2CJFrWIIQ=
@@ -240,8 +244,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
 golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
-golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -252,8 +256,8 @@ golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -275,8 +279,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -286,9 +290,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -346,5 +350,7 @@ modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU=
 modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI=
 modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
 modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
+modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws=
 modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg=
 modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE=

+ 4 - 0
go.work.sum

@@ -302,6 +302,8 @@ github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
 github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 h1:OTlfMvwR1rLyf9goVmXfuS5AJn80+Vmj4rTf4n46SOs=
 github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
 github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
 github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro=
@@ -345,6 +347,7 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc
 github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY=
 github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
 github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
+github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU=
 github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
@@ -427,6 +430,7 @@ golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=

+ 60 - 60
internal/io/edgex/edgex_sink.go

@@ -21,9 +21,9 @@ import (
 	"encoding/base64"
 	"encoding/json"
 	"fmt"
-	v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/requests"
+	v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/requests"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"github.com/lf-edge/ekuiper/internal/topo/connection/clients"
 	"github.com/lf-edge/ekuiper/pkg/api"
@@ -169,10 +169,10 @@ func (ems *EdgexMsgBusSink) produceEvents(ctx api.StreamContext, item interface{
 					continue
 				}
 				switch vt {
-				case v2.ValueTypeBinary:
+				case v3.ValueTypeBinary:
 					// default media type
 					event.AddBinaryReading(k1, vv.([]byte), "application/text")
-				case v2.ValueTypeObject:
+				case v3.ValueTypeObject:
 					event.AddObjectReading(k1, vv)
 				default:
 					err = event.AddSimpleReading(k1, vt, vv)
@@ -200,33 +200,33 @@ func getValueType(v interface{}) (string, interface{}, error) {
 	k := vt.Kind()
 	switch k {
 	case reflect.Bool:
-		return v2.ValueTypeBool, v, nil
+		return v3.ValueTypeBool, v, nil
 	case reflect.String:
-		return v2.ValueTypeString, v, nil
+		return v3.ValueTypeString, v, nil
 	case reflect.Uint8:
-		return v2.ValueTypeUint8, v, nil
+		return v3.ValueTypeUint8, v, nil
 	case reflect.Uint16:
-		return v2.ValueTypeUint16, v, nil
+		return v3.ValueTypeUint16, v, nil
 	case reflect.Uint32:
-		return v2.ValueTypeUint32, v, nil
+		return v3.ValueTypeUint32, v, nil
 	case reflect.Uint64:
-		return v2.ValueTypeUint64, v, nil
+		return v3.ValueTypeUint64, v, nil
 	case reflect.Uint:
-		return v2.ValueTypeUint64, uint64(v.(uint)), nil
+		return v3.ValueTypeUint64, uint64(v.(uint)), nil
 	case reflect.Int8:
-		return v2.ValueTypeInt8, v, nil
+		return v3.ValueTypeInt8, v, nil
 	case reflect.Int16:
-		return v2.ValueTypeInt16, v, nil
+		return v3.ValueTypeInt16, v, nil
 	case reflect.Int32:
-		return v2.ValueTypeInt32, v, nil
+		return v3.ValueTypeInt32, v, nil
 	case reflect.Int64:
-		return v2.ValueTypeInt64, v, nil
+		return v3.ValueTypeInt64, v, nil
 	case reflect.Int:
-		return v2.ValueTypeInt64, int64(v.(int)), nil
+		return v3.ValueTypeInt64, int64(v.(int)), nil
 	case reflect.Float32:
-		return v2.ValueTypeFloat32, v, nil
+		return v3.ValueTypeFloat32, v, nil
 	case reflect.Float64:
-		return v2.ValueTypeFloat64, v, nil
+		return v3.ValueTypeFloat64, v, nil
 	case reflect.Slice:
 		switch arrayValue := v.(type) {
 		case []interface{}:
@@ -245,7 +245,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeBoolArray, result, nil
+					return v3.ValueTypeBoolArray, result, nil
 				case reflect.String:
 					result := make([]string, len(arrayValue))
 					for i, av := range arrayValue {
@@ -255,7 +255,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeStringArray, result, nil
+					return v3.ValueTypeStringArray, result, nil
 				case reflect.Int8:
 					result := make([]int8, len(arrayValue))
 					for i, av := range arrayValue {
@@ -265,7 +265,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeInt8Array, result, nil
+					return v3.ValueTypeInt8Array, result, nil
 				case reflect.Int16:
 					result := make([]int16, len(arrayValue))
 					for i, av := range arrayValue {
@@ -275,7 +275,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeInt16Array, result, nil
+					return v3.ValueTypeInt16Array, result, nil
 				case reflect.Int32:
 					result := make([]int32, len(arrayValue))
 					for i, av := range arrayValue {
@@ -285,7 +285,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeInt32Array, result, nil
+					return v3.ValueTypeInt32Array, result, nil
 				case reflect.Int64, reflect.Int:
 					result := make([]int64, len(arrayValue))
 					for i, av := range arrayValue {
@@ -295,7 +295,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeInt64Array, result, nil
+					return v3.ValueTypeInt64Array, result, nil
 				case reflect.Uint8:
 					result := make([]uint8, len(arrayValue))
 					for i, av := range arrayValue {
@@ -305,7 +305,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeUint8Array, result, nil
+					return v3.ValueTypeUint8Array, result, nil
 				case reflect.Uint16:
 					result := make([]uint16, len(arrayValue))
 					for i, av := range arrayValue {
@@ -315,7 +315,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeUint16Array, result, nil
+					return v3.ValueTypeUint16Array, result, nil
 				case reflect.Uint32:
 					result := make([]uint32, len(arrayValue))
 					for i, av := range arrayValue {
@@ -325,7 +325,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeUint32Array, result, nil
+					return v3.ValueTypeUint32Array, result, nil
 				case reflect.Uint64, reflect.Uint:
 					result := make([]uint64, len(arrayValue))
 					for i, av := range arrayValue {
@@ -335,7 +335,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeUint64Array, result, nil
+					return v3.ValueTypeUint64Array, result, nil
 				case reflect.Float32:
 					result := make([]float32, len(arrayValue))
 					for i, av := range arrayValue {
@@ -345,7 +345,7 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeFloat64Array, result, nil
+					return v3.ValueTypeFloat64Array, result, nil
 				case reflect.Float64:
 					result := make([]float64, len(arrayValue))
 					for i, av := range arrayValue {
@@ -355,83 +355,83 @@ func getValueType(v interface{}) (string, interface{}, error) {
 						}
 						result[i] = temp
 					}
-					return v2.ValueTypeFloat64Array, result, nil
+					return v3.ValueTypeFloat64Array, result, nil
 				}
 			} else { // default to string array
-				return v2.ValueTypeStringArray, []string{}, nil
+				return v3.ValueTypeStringArray, []string{}, nil
 			}
 		case []byte:
-			return v2.ValueTypeBinary, v, nil
+			return v3.ValueTypeBinary, v, nil
 		}
 	}
-	return v2.ValueTypeObject, v, nil
+	return v3.ValueTypeObject, v, nil
 }
 
 func getValueByType(v interface{}, vt string) (interface{}, error) {
 	switch vt {
-	case v2.ValueTypeBool:
+	case v3.ValueTypeBool:
 		return cast.ToBool(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt8:
+	case v3.ValueTypeInt8:
 		return cast.ToInt8(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt16:
+	case v3.ValueTypeInt16:
 		return cast.ToInt16(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt32:
+	case v3.ValueTypeInt32:
 		return cast.ToInt32(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt64:
+	case v3.ValueTypeInt64:
 		return cast.ToInt64(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint8:
+	case v3.ValueTypeUint8:
 		return cast.ToUint8(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint16:
+	case v3.ValueTypeUint16:
 		return cast.ToUint16(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint32:
+	case v3.ValueTypeUint32:
 		return cast.ToUint32(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint64:
+	case v3.ValueTypeUint64:
 		return cast.ToUint64(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeFloat32:
+	case v3.ValueTypeFloat32:
 		return cast.ToFloat32(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeFloat64:
+	case v3.ValueTypeFloat64:
 		return cast.ToFloat64(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeString:
+	case v3.ValueTypeString:
 		return cast.ToString(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeBoolArray:
+	case v3.ValueTypeBoolArray:
 		return cast.ToBoolSlice(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt8Array:
+	case v3.ValueTypeInt8Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToInt8(input, sn)
 		}, "int8", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt16Array:
+	case v3.ValueTypeInt16Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToInt16(input, sn)
 		}, "int16", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt32Array:
+	case v3.ValueTypeInt32Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToInt32(input, sn)
 		}, "int32", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeInt64Array:
+	case v3.ValueTypeInt64Array:
 		return cast.ToInt64Slice(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint8Array:
+	case v3.ValueTypeUint8Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToUint8(input, sn)
 		}, "uint8", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint16Array:
+	case v3.ValueTypeUint16Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToUint16(input, sn)
 		}, "uint16", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint32Array:
+	case v3.ValueTypeUint32Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToUint32(input, sn)
 		}, "uint32", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeUint64Array:
+	case v3.ValueTypeUint64Array:
 		return cast.ToUint64Slice(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeFloat32Array:
+	case v3.ValueTypeFloat32Array:
 		return cast.ToTypedSlice(v, func(input interface{}, sn cast.Strictness) (interface{}, error) {
 			return cast.ToFloat32(input, sn)
 		}, "float32", cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeFloat64Array:
+	case v3.ValueTypeFloat64Array:
 		return cast.ToFloat64Slice(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeStringArray:
+	case v3.ValueTypeStringArray:
 		return cast.ToStringSlice(v, cast.CONVERT_SAMEKIND)
-	case v2.ValueTypeBinary:
+	case v3.ValueTypeBinary:
 		var (
 			bv  []byte
 			err error
@@ -447,7 +447,7 @@ func getValueByType(v interface{}, vt string) (interface{}, error) {
 			return nil, fmt.Errorf("fail to decode binary value from %v: not binary type", vv)
 		}
 		return bv, nil
-	case v2.ValueTypeObject:
+	case v3.ValueTypeObject:
 		return v, nil
 	default:
 		return nil, fmt.Errorf("unsupported type %v", vt)

+ 20 - 20
internal/io/edgex/edgex_sink_test.go

@@ -20,8 +20,8 @@ package edgex
 import (
 	"encoding/json"
 	"fmt"
-	v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
+	v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"github.com/lf-edge/ekuiper/internal/testx"
 	"github.com/lf-edge/ekuiper/internal/topo/context"
@@ -59,7 +59,7 @@ func compareEvent(expected, actual *dtos.Event) bool {
 
 func compareReading(expected, actual dtos.BaseReading) bool {
 	if (expected.Id == actual.Id || (expected.Id == "" && actual.Id != "")) && expected.ProfileName == actual.ProfileName && expected.DeviceName == actual.DeviceName && (expected.Origin == actual.Origin || (expected.Origin == 0 && actual.Origin > 0)) && expected.ResourceName == actual.ResourceName && expected.Value == actual.Value && expected.ValueType == actual.ValueType {
-		if expected.ValueType == v2.ValueTypeObject {
+		if expected.ValueType == v3.ValueTypeObject {
 			if !reflect.DeepEqual(expected.ObjectValue, actual.ObjectValue) {
 				return false
 			}
@@ -220,7 +220,7 @@ func TestProduceEvents(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "12",
 						Origin:        14,
-						ValueType:     v2.ValueTypeInt64,
+						ValueType:     v3.ValueTypeInt64,
 						SimpleReading: dtos.SimpleReading{Value: "100"},
 					},
 					{
@@ -229,7 +229,7 @@ func TestProduceEvents(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "22",
 						Origin:        24,
-						ValueType:     v2.ValueTypeFloat64,
+						ValueType:     v3.ValueTypeFloat64,
 						SimpleReading: dtos.SimpleReading{Value: "5.000000e+01"},
 					},
 				},
@@ -264,7 +264,7 @@ func TestProduceEvents(t1 *testing.T) {
 						SimpleReading: dtos.SimpleReading{Value: "1.000000e+02"},
 						DeviceName:    "demo",
 						ProfileName:   "demoProfile",
-						ValueType:     v2.ValueTypeFloat64,
+						ValueType:     v3.ValueTypeFloat64,
 					},
 				},
 			},
@@ -288,14 +288,14 @@ func TestProduceEvents(t1 *testing.T) {
 						SimpleReading: dtos.SimpleReading{Value: "5.000000e+01"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeFloat64,
+						ValueType:     v3.ValueTypeFloat64,
 					},
 					{
 						ResourceName:  "h1",
 						SimpleReading: dtos.SimpleReading{Value: "1.000000e+02"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeFloat64,
+						ValueType:     v3.ValueTypeFloat64,
 					},
 				},
 			},
@@ -319,28 +319,28 @@ func TestProduceEvents(t1 *testing.T) {
 						SimpleReading: dtos.SimpleReading{Value: "newmeta"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeString,
+						ValueType:     v3.ValueTypeString,
 					},
 					{
 						ResourceName:  "h1",
 						SimpleReading: dtos.SimpleReading{Value: "true"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeBool,
+						ValueType:     v3.ValueTypeBool,
 					},
 					{
 						ResourceName:  "sa",
 						SimpleReading: dtos.SimpleReading{Value: "[1, 2, 3, 4]"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeStringArray,
+						ValueType:     v3.ValueTypeStringArray,
 					},
 					{
 						ResourceName:  "fa",
 						SimpleReading: dtos.SimpleReading{Value: "[1.100000e+00, 2.200000e+00, 3.300000e+00, 4.400000e+00]"},
 						DeviceName:    "ekuiper",
 						ProfileName:   "ekuiperProfile",
-						ValueType:     v2.ValueTypeFloat64Array,
+						ValueType:     v3.ValueTypeFloat64Array,
 					},
 				},
 			},
@@ -399,7 +399,7 @@ func TestProduceEvents(t1 *testing.T) {
 						ProfileName:   "demoProfile",
 						ResourceName:  "meta1",
 						SimpleReading: dtos.SimpleReading{Value: "newmeta"},
-						ValueType:     v2.ValueTypeString,
+						ValueType:     v3.ValueTypeString,
 					},
 					{
 						ResourceName:  "sa",
@@ -408,7 +408,7 @@ func TestProduceEvents(t1 *testing.T) {
 						DeviceName:    "test device name1",
 						Id:            "12",
 						Origin:        14,
-						ValueType:     v2.ValueTypeBinary,
+						ValueType:     v3.ValueTypeBinary,
 					},
 				},
 			},
@@ -438,7 +438,7 @@ func TestProduceEvents(t1 *testing.T) {
 						ProfileName:  "ekuiperProfile",
 						Id:           "12",
 						Origin:       14,
-						ValueType:    v2.ValueTypeObject,
+						ValueType:    v3.ValueTypeObject,
 						ObjectReading: dtos.ObjectReading{ObjectValue: map[string]interface{}{
 							"a": float64(1),
 							"b": "sttt",
@@ -465,7 +465,7 @@ func TestProduceEvents(t1 *testing.T) {
 						ProfileName:  "ekuiperProfile",
 						Id:           "",
 						Origin:       0,
-						ValueType:    v2.ValueTypeObject,
+						ValueType:    v3.ValueTypeObject,
 						ObjectReading: dtos.ObjectReading{ObjectValue: map[string]interface{}{
 							"a": float64(1),
 							"b": "sttt",
@@ -533,7 +533,7 @@ func TestEdgeXTemplate_Apply(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "",
 						Origin:        0,
-						ValueType:     v2.ValueTypeString,
+						ValueType:     v3.ValueTypeString,
 						SimpleReading: dtos.SimpleReading{Value: "w1"},
 					},
 					{
@@ -542,7 +542,7 @@ func TestEdgeXTemplate_Apply(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "",
 						Origin:        0,
-						ValueType:     v2.ValueTypeString,
+						ValueType:     v3.ValueTypeString,
 						SimpleReading: dtos.SimpleReading{Value: "100"},
 					},
 				},
@@ -566,7 +566,7 @@ func TestEdgeXTemplate_Apply(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "",
 						Origin:        0,
-						ValueType:     v2.ValueTypeFloat64,
+						ValueType:     v3.ValueTypeFloat64,
 						SimpleReading: dtos.SimpleReading{Value: "2.400000e+01"},
 					},
 					{
@@ -575,7 +575,7 @@ func TestEdgeXTemplate_Apply(t1 *testing.T) {
 						ProfileName:   "ekuiperProfile",
 						Id:            "",
 						Origin:        0,
-						ValueType:     v2.ValueTypeString,
+						ValueType:     v3.ValueTypeString,
 						SimpleReading: dtos.SimpleReading{Value: "c"},
 					},
 				},

+ 19 - 18
internal/io/edgex/edgex_source.go

@@ -20,10 +20,10 @@ package edgex
 import (
 	"encoding/json"
 	"fmt"
-	v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/requests"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/requests"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"github.com/fxamacker/cbor/v2"
 	"github.com/lf-edge/ekuiper/internal/topo/connection/clients"
 	"github.com/lf-edge/ekuiper/pkg/api"
@@ -85,6 +85,7 @@ func (es *EdgexSource) Open(ctx api.StreamContext, consumer chan<- api.SourceTup
 	messages := make(chan interface{}, es.buflen)
 	topics := []api.TopicChannel{{Topic: es.topic, Messages: messages}}
 	subErrs := make(chan error, len(topics))
+
 	if e := es.cli.Subscribe(ctx, topics, subErrs, nil); e != nil {
 		log.Errorf("Failed to subscribe to edgex messagebus topic %s.\n", e)
 		errCh <- e
@@ -208,73 +209,73 @@ func (es *EdgexSource) getValue(r dtos.BaseReading, logger api.Logger) (interfac
 	logger.Debugf("name %s with type %s", r.ResourceName, r.ValueType)
 	v := r.Value
 	switch t {
-	case v2.ValueTypeBool:
+	case v3.ValueTypeBool:
 		if r, err := strconv.ParseBool(v); err != nil {
 			return nil, err
 		} else {
 			return r, nil
 		}
-	case v2.ValueTypeInt8, v2.ValueTypeInt16, v2.ValueTypeInt32, v2.ValueTypeInt64, v2.ValueTypeUint8, v2.ValueTypeUint16, v2.ValueTypeUint32:
+	case v3.ValueTypeInt8, v3.ValueTypeInt16, v3.ValueTypeInt32, v3.ValueTypeInt64, v3.ValueTypeUint8, v3.ValueTypeUint16, v3.ValueTypeUint32:
 		if r, err := strconv.Atoi(v); err != nil {
 			return nil, err
 		} else {
 			return r, nil
 		}
-	case v2.ValueTypeUint64:
+	case v3.ValueTypeUint64:
 		if u64, err := strconv.ParseUint(v, 10, 64); err != nil {
 			return nil, err
 		} else {
 			return u64, nil
 		}
-	case v2.ValueTypeFloat32:
+	case v3.ValueTypeFloat32:
 		if r, err := strconv.ParseFloat(v, 32); err != nil {
 			return nil, err
 		} else {
 			return r, nil
 		}
-	case v2.ValueTypeFloat64:
+	case v3.ValueTypeFloat64:
 		if r, err := strconv.ParseFloat(v, 64); err != nil {
 			return nil, err
 		} else {
 			return r, nil
 		}
-	case v2.ValueTypeString:
+	case v3.ValueTypeString:
 		return v, nil
-	case v2.ValueTypeBoolArray:
+	case v3.ValueTypeBoolArray:
 		var val []bool
 		if e := json.Unmarshal([]byte(v), &val); e == nil {
 			return val, nil
 		} else {
 			return nil, e
 		}
-	case v2.ValueTypeInt8Array, v2.ValueTypeInt16Array, v2.ValueTypeInt32Array, v2.ValueTypeInt64Array, v2.ValueTypeUint8Array, v2.ValueTypeUint16Array, v2.ValueTypeUint32Array:
+	case v3.ValueTypeInt8Array, v3.ValueTypeInt16Array, v3.ValueTypeInt32Array, v3.ValueTypeInt64Array, v3.ValueTypeUint8Array, v3.ValueTypeUint16Array, v3.ValueTypeUint32Array:
 		var val []int
 		if e := json.Unmarshal([]byte(v), &val); e == nil {
 			return val, nil
 		} else {
 			return nil, e
 		}
-	case v2.ValueTypeUint64Array:
+	case v3.ValueTypeUint64Array:
 		var val []uint64
 		if e := json.Unmarshal([]byte(v), &val); e == nil {
 			return val, nil
 		} else {
 			return nil, e
 		}
-	case v2.ValueTypeFloat32Array:
+	case v3.ValueTypeFloat32Array:
 		return convertFloatArray(v, 32)
-	case v2.ValueTypeFloat64Array:
+	case v3.ValueTypeFloat64Array:
 		return convertFloatArray(v, 64)
-	case v2.ValueTypeStringArray:
+	case v3.ValueTypeStringArray:
 		var val []string
 		if e := json.Unmarshal([]byte(v), &val); e == nil {
 			return val, nil
 		} else {
 			return nil, e
 		}
-	case v2.ValueTypeBinary:
+	case v3.ValueTypeBinary:
 		return r.BinaryValue, nil
-	case v2.ValueTypeObject:
+	case v3.ValueTypeObject:
 		return r.ObjectValue, nil
 	default:
 		logger.Warnf("Not supported type %s, and processed as string value", t)

+ 30 - 30
internal/io/edgex/edgex_source_test.go

@@ -20,10 +20,10 @@ package edgex
 import (
 	"encoding/json"
 	"fmt"
-	v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/models"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/models"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"math"
 	"reflect"
@@ -33,29 +33,29 @@ import (
 var (
 	es      = &EdgexSource{}
 	typeMap = map[string]string{
-		"b1":  v2.ValueTypeBool,
-		"i1":  v2.ValueTypeInt8,
-		"i2":  v2.ValueTypeInt16,
-		"i3":  v2.ValueTypeInt32,
-		"i4":  v2.ValueTypeInt64,
-		"i5":  v2.ValueTypeUint8,
-		"i6":  v2.ValueTypeUint16,
-		"i7":  v2.ValueTypeUint32,
-		"s1":  v2.ValueTypeString,
-		"f1":  v2.ValueTypeFloat32,
-		"f2":  v2.ValueTypeFloat64,
-		"i8":  v2.ValueTypeUint64,
-		"ba":  v2.ValueTypeBoolArray,
-		"ia1": v2.ValueTypeInt8Array,
-		"ia2": v2.ValueTypeInt16Array,
-		"ia3": v2.ValueTypeInt32Array,
-		"ia4": v2.ValueTypeInt64Array,
-		"ia5": v2.ValueTypeUint8Array,
-		"ia6": v2.ValueTypeUint16Array,
-		"ia7": v2.ValueTypeUint32Array,
-		"ia8": v2.ValueTypeUint64Array,
-		"fa1": v2.ValueTypeFloat32Array,
-		"fa2": v2.ValueTypeFloat64Array,
+		"b1":  v3.ValueTypeBool,
+		"i1":  v3.ValueTypeInt8,
+		"i2":  v3.ValueTypeInt16,
+		"i3":  v3.ValueTypeInt32,
+		"i4":  v3.ValueTypeInt64,
+		"i5":  v3.ValueTypeUint8,
+		"i6":  v3.ValueTypeUint16,
+		"i7":  v3.ValueTypeUint32,
+		"s1":  v3.ValueTypeString,
+		"f1":  v3.ValueTypeFloat32,
+		"f2":  v3.ValueTypeFloat64,
+		"i8":  v3.ValueTypeUint64,
+		"ba":  v3.ValueTypeBoolArray,
+		"ia1": v3.ValueTypeInt8Array,
+		"ia2": v3.ValueTypeInt16Array,
+		"ia3": v3.ValueTypeInt32Array,
+		"ia4": v3.ValueTypeInt64Array,
+		"ia5": v3.ValueTypeUint8Array,
+		"ia6": v3.ValueTypeUint16Array,
+		"ia7": v3.ValueTypeUint32Array,
+		"ia8": v3.ValueTypeUint64Array,
+		"fa1": v3.ValueTypeFloat32Array,
+		"fa2": v3.ValueTypeFloat64Array,
 	}
 )
 
@@ -314,12 +314,12 @@ func TestWrongValue(t *testing.T) {
 }
 
 func TestPrintConf(t *testing.T) {
-	expMbconf := types.MessageBusConfig{SubscribeHost: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
+	expMbconf := types.MessageBusConfig{Broker: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
 		"proa":     "proa",
 		"Password": "fafsadfsadf=",
 		"Prob":     "Prob",
 	}}
-	mbconf := types.MessageBusConfig{SubscribeHost: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
+	mbconf := types.MessageBusConfig{Broker: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
 		"proa":     "proa",
 		"Password": "fafsadfsadf=",
 		"Prob":     "Prob",
@@ -331,7 +331,7 @@ func TestPrintConf(t *testing.T) {
 
 func TestGetValue_Binary(t *testing.T) {
 	ev := []byte("Hello World")
-	r1 := dtos.BaseReading{ResourceName: "bin", ValueType: v2.ValueTypeBinary, BinaryReading: dtos.BinaryReading{MediaType: "application/text", BinaryValue: ev}}
+	r1 := dtos.BaseReading{ResourceName: "bin", ValueType: v3.ValueTypeBinary, BinaryReading: dtos.BinaryReading{MediaType: "application/text", BinaryValue: ev}}
 	if v, e := es.getValue(r1, conf.Log); e != nil {
 		t.Errorf("%s", e)
 	} else if !reflect.DeepEqual(ev, v) {

+ 8 - 28
internal/topo/connection/clients/edgex/client_edgex_test.go

@@ -1,4 +1,4 @@
-// Copyright 2022 EMQ Technologies Co., Ltd.
+// Copyright 2022-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
 package edgex
 
 import (
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"reflect"
 	"testing"
 )
@@ -46,12 +46,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 			},
 			wantErr: false,
 			expConf: types.MessageBusConfig{
-				PublishHost: types.HostInfo{
-					Host:     "127.0.0.1",
-					Port:     1883,
-					Protocol: "tcp",
-				},
-				SubscribeHost: types.HostInfo{
+				Broker: types.HostInfo{
 					Host:     "127.0.0.1",
 					Port:     1883,
 					Protocol: "tcp",
@@ -74,12 +69,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 			},
 			wantErr: false,
 			expConf: types.MessageBusConfig{
-				PublishHost: types.HostInfo{
-					Host:     "edgex-redis",
-					Port:     6379,
-					Protocol: "redis",
-				},
-				SubscribeHost: types.HostInfo{
+				Broker: types.HostInfo{
 					Host:     "edgex-redis",
 					Port:     6379,
 					Protocol: "redis",
@@ -100,12 +90,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 				},
 			},
 			expConf: types.MessageBusConfig{
-				PublishHost: types.HostInfo{
-					Host:     "127.0.0.1",
-					Port:     1883,
-					Protocol: "tcp",
-				},
-				SubscribeHost: types.HostInfo{
+				Broker: types.HostInfo{
 					Host:     "127.0.0.1",
 					Port:     1883,
 					Protocol: "tcp",
@@ -119,7 +104,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 			wantErr: false,
 		},
 		{
-			name: "config type not in zero/mqtt/redis ",
+			name: "config type not in mqtt/redis ",
 			props: map[string]interface{}{
 				"protocol": "tcp",
 				"server":   "127.0.0.1",
@@ -141,12 +126,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 				},
 			},
 			expConf: types.MessageBusConfig{
-				PublishHost: types.HostInfo{
-					Host:     "localhost",
-					Port:     6379,
-					Protocol: "redis",
-				},
-				SubscribeHost: types.HostInfo{
+				Broker: types.HostInfo{
 					Host:     "localhost",
 					Port:     6379,
 					Protocol: "redis",
@@ -190,7 +170,7 @@ func TestEdgex_CfgValidate(t *testing.T) {
 		{
 			name: "wrong type value",
 			props: map[string]interface{}{
-				"type":     "zmq",
+				"type":     "mqt",
 				"protocol": "redis",
 				"host":     "edgex-redis",
 				"port":     6379,

+ 6 - 12
internal/topo/connection/clients/edgex/edgex.go

@@ -1,4 +1,4 @@
-// Copyright 2022 EMQ Technologies Co., Ltd.
+// Copyright 2022-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@ package edgex
 
 import (
 	"fmt"
-	"github.com/edgexfoundry/go-mod-messaging/v2/messaging"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	"github.com/edgexfoundry/go-mod-messaging/v3/messaging"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"github.com/lf-edge/ekuiper/pkg/cast"
 	"strings"
@@ -89,9 +89,8 @@ func (es *EdgexClient) CfgValidate(props map[string]interface{}) error {
 		edgeAddr = c.Server
 	}
 
-	if c.Type != messaging.ZeroMQ && c.Type != messaging.MQTT &&
-		c.Type != messaging.Redis && c.Type != messaging.NatsCore &&
-		c.Type != messaging.NatsJetStream {
+	if c.Type != messaging.MQTT && c.Type != messaging.Redis &&
+		c.Type != messaging.NatsCore && c.Type != messaging.NatsJetStream {
 		return fmt.Errorf("specified wrong type value %s", c.Type)
 	}
 	if c.Port < 0 {
@@ -99,12 +98,7 @@ func (es *EdgexClient) CfgValidate(props map[string]interface{}) error {
 	}
 
 	mbconf := types.MessageBusConfig{
-		SubscribeHost: types.HostInfo{
-			Host:     edgeAddr,
-			Port:     c.Port,
-			Protocol: c.Protocol,
-		},
-		PublishHost: types.HostInfo{
+		Broker: types.HostInfo{
 			Host:     edgeAddr,
 			Port:     c.Port,
 			Protocol: c.Protocol,

+ 2 - 2
internal/topo/connection/clients/edgex/edgex_wrapper.go

@@ -1,4 +1,4 @@
-// Copyright 2022 EMQ Technologies Co., Ltd.
+// Copyright 2022-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ package edgex
 
 import (
 	"fmt"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"github.com/lf-edge/ekuiper/internal/topo/connection/clients"
 	"github.com/lf-edge/ekuiper/pkg/api"

+ 13 - 13
test/edgex/benchmark/pub.go

@@ -1,4 +1,4 @@
-// Copyright 2021 EMQ Technologies Co., Ltd.
+// Copyright 2021-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -22,10 +22,10 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
-	"github.com/edgexfoundry/go-mod-messaging/v2/messaging"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+	"github.com/edgexfoundry/go-mod-messaging/v3/messaging"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"log"
 	"os"
 	"strconv"
@@ -34,12 +34,12 @@ import (
 )
 
 var msgConfig1 = types.MessageBusConfig{
-	PublishHost: types.HostInfo{
+	Broker: types.HostInfo{
 		Host:     "172.31.1.144",
-		Port:     5563,
-		Protocol: "tcp",
+		Port:     6379,
+		Protocol: "redis",
 	},
-	Type: messaging.ZeroMQ,
+	Type: messaging.Redis,
 }
 
 type data struct {
@@ -60,7 +60,7 @@ var mockup = []data{
 	{temperature: 55, humidity: 60},
 }
 
-func pubEventClientZeroMq(count int, wg *sync.WaitGroup) {
+func pubEventClientRedis(count int, wg *sync.WaitGroup) {
 	defer wg.Done()
 	if msgClient, err := messaging.NewMessageClient(msgConfig1); err != nil {
 		log.Fatal(err)
@@ -75,13 +75,13 @@ func pubEventClientZeroMq(count int, wg *sync.WaitGroup) {
 				}
 
 				testEvent := dtos.NewEvent("demoProfile", "demo", "demoSource")
-				err := testEvent.AddSimpleReading("Temperature", v2.ValueTypeInt32, int32(mockup[index].temperature))
+				err := testEvent.AddSimpleReading("Temperature", v3.ValueTypeInt32, int32(mockup[index].temperature))
 				if err != nil {
 					fmt.Errorf("Add reading error for Temperature: %v\n", int32(mockup[index].temperature))
 				}
 				testEvent.Readings[0].DeviceName = "Temperature device"
 
-				err = testEvent.AddSimpleReading("Humidity", v2.ValueTypeInt32, int32(mockup[index].humidity))
+				err = testEvent.AddSimpleReading("Humidity", v3.ValueTypeInt32, int32(mockup[index].humidity))
 				if err != nil {
 					fmt.Errorf("Add reading error for Humidity: %v\n", int32(mockup[index].temperature))
 				}
@@ -122,7 +122,7 @@ func main() {
 	var wg sync.WaitGroup
 	for i := 0; i < 1; i++ {
 		wg.Add(1)
-		go pubEventClientZeroMq(count, &wg)
+		go pubEventClientRedis(count, &wg)
 	}
 	wg.Wait()
 	t := time.Now()

+ 15 - 123
test/edgex/pub.go

@@ -1,4 +1,4 @@
-// Copyright 2021 EMQ Technologies Co., Ltd.
+// Copyright 2021-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -21,26 +21,25 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/common"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
-	"github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/requests"
-	"github.com/edgexfoundry/go-mod-messaging/v2/messaging"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+	"github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+	"github.com/edgexfoundry/go-mod-messaging/v3/messaging"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"log"
 	"os"
 	"time"
 )
 
 var msgConfig1 = types.MessageBusConfig{
-	PublishHost: types.HostInfo{
-		Host:     "*",
-		Port:     5563,
-		Protocol: "tcp",
+	Broker: types.HostInfo{
+		Host:     "127.0.0.1",
+		Port:     6379,
+		Protocol: "redis",
 	},
-	Type: messaging.ZeroMQ,
+	Type: messaging.Redis,
 }
 
-func pubEventClientZeroMq() {
+func pubEventClientRedis() {
 	if msgClient, err := messaging.NewMessageClient(msgConfig1); err != nil {
 		log.Fatal(err)
 	} else {
@@ -101,64 +100,8 @@ func pubEventClientZeroMq() {
 	}
 }
 
-func pubToAnother() {
-	var msgConfig2 = types.MessageBusConfig{
-		PublishHost: types.HostInfo{
-			Host:     "*",
-			Port:     5571,
-			Protocol: "tcp",
-		},
-		Type: messaging.ZeroMQ,
-	}
-	if msgClient, err := messaging.NewMessageClient(msgConfig2); err != nil {
-		log.Fatal(err)
-	} else {
-		if ec := msgClient.Connect(); ec != nil {
-			log.Fatal(ec)
-		}
-
-		testEvent := dtos.NewEvent("demo1Profile", "demo1", "demo1Source")
-		testEvent.Origin = 123
-		err := testEvent.AddSimpleReading("Temperature", common.ValueTypeInt64, int64(20))
-		if err != nil {
-			fmt.Printf("Add reading error for Temperature: %v\n", 20)
-		}
-		err = testEvent.AddSimpleReading("Humidity", common.ValueTypeInt64, int64(30))
-		if err != nil {
-			fmt.Printf("Add reading error for Humidity: %v\n", 20)
-		}
-
-		req := requests.NewAddEventRequest(testEvent)
-
-		data, err := json.Marshal(req)
-		if err != nil {
-			fmt.Printf("unexpected error marshal request %v", err)
-		} else {
-			fmt.Println(string(data))
-		}
-
-		env := types.NewMessageEnvelope(data, context.Background())
-		env.ContentType = "application/json"
-
-		if e := msgClient.Publish(env, "application"); e != nil {
-			log.Fatal(e)
-		} else {
-			fmt.Printf("pubToAnother successful: %s\n", data)
-		}
-		time.Sleep(1500 * time.Millisecond)
-	}
-}
-
 func pubArrayMessage() {
-	var msgConfig2 = types.MessageBusConfig{
-		PublishHost: types.HostInfo{
-			Host:     "*",
-			Port:     5563,
-			Protocol: "tcp",
-		},
-		Type: messaging.ZeroMQ,
-	}
-	if msgClient, err := messaging.NewMessageClient(msgConfig2); err != nil {
+	if msgClient, err := messaging.NewMessageClient(msgConfig1); err != nil {
 		log.Fatal(err)
 	} else {
 		if ec := msgClient.Connect(); ec != nil {
@@ -199,7 +142,7 @@ func pubArrayMessage() {
 
 func pubToMQTT(host string) {
 	var msgConfig2 = types.MessageBusConfig{
-		PublishHost: types.HostInfo{
+		Broker: types.HostInfo{
 			Host:     host,
 			Port:     1883,
 			Protocol: "tcp",
@@ -245,51 +188,6 @@ func pubToMQTT(host string) {
 	}
 }
 
-func pubToRedis(host string) {
-	var msgConfig2 = types.MessageBusConfig{
-		PublishHost: types.HostInfo{
-			Host:     host,
-			Port:     6379,
-			Protocol: "redis",
-		},
-		Type: messaging.Redis,
-	}
-	if msgClient, err := messaging.NewMessageClient(msgConfig2); err != nil {
-		log.Fatal(err)
-	} else {
-		if ec := msgClient.Connect(); ec != nil {
-			log.Fatal(ec)
-		}
-		testEvent := dtos.NewEvent("demo1Profile", "demo1", "demo1Source")
-		testEvent.Origin = 123
-		err := testEvent.AddSimpleReading("Temperature", common.ValueTypeInt64, int64(20))
-		if err != nil {
-			fmt.Printf("Add reading error for Temperature: %v\n", 20)
-		}
-		err = testEvent.AddSimpleReading("Humidity", common.ValueTypeInt64, int64(30))
-		if err != nil {
-			fmt.Printf("Add reading error for Humidity: %v\n", 20)
-		}
-
-		data, err := json.Marshal(testEvent)
-		if err != nil {
-			fmt.Printf("unexpected error MarshalEvent %v", err)
-		} else {
-			fmt.Println(string(data))
-		}
-
-		env := types.NewMessageEnvelope(data, context.Background())
-		env.ContentType = "application/json"
-
-		if e := msgClient.Publish(env, "events"); e != nil {
-			log.Fatal(e)
-		} else {
-			fmt.Printf("pubToRedis successful: %s\n", data)
-		}
-		time.Sleep(1500 * time.Millisecond)
-	}
-}
-
 func pubMetaSource() {
 	if msgClient, err := messaging.NewMessageClient(msgConfig1); err != nil {
 		log.Fatal(err)
@@ -341,11 +239,9 @@ func pubMetaSource() {
 
 func main() {
 	if len(os.Args) == 1 {
-		pubEventClientZeroMq()
+		pubEventClientRedis()
 	} else if len(os.Args) == 2 {
-		if v := os.Args[1]; v == "another" {
-			pubToAnother()
-		} else if v == "meta" {
+		if v := os.Args[1]; v == "meta" {
 			pubMetaSource()
 		} else if v == "array" {
 			pubArrayMessage()
@@ -355,9 +251,5 @@ func main() {
 			//The 2nd parameter is MQTT broker server address
 			pubToMQTT(os.Args[2])
 		}
-		if v := os.Args[1]; v == "redis" {
-			//The 2nd parameter is MQTT broker server address
-			pubToRedis(os.Args[2])
-		}
 	}
 }

+ 6 - 51
test/edgex/sub/sub.go

@@ -1,4 +1,4 @@
-// Copyright 2021 EMQ Technologies Co., Ltd.
+// Copyright 2021-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,58 +19,15 @@ package main
 
 import (
 	"fmt"
-	"github.com/edgexfoundry/go-mod-messaging/v2/messaging"
-	"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
+	"github.com/edgexfoundry/go-mod-messaging/v3/messaging"
+	"github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
 	"github.com/lf-edge/ekuiper/internal/conf"
 	"os"
 )
 
-func subEventsFromZMQ() {
-	var msgConfig1 = types.MessageBusConfig{
-		SubscribeHost: types.HostInfo{
-			Host:     "localhost",
-			Port:     5571,
-			Protocol: "tcp",
-		},
-		Type: messaging.ZeroMQ,
-	}
-
-	if msgClient, err := messaging.NewMessageClient(msgConfig1); err != nil {
-		conf.Log.Fatal(err)
-	} else {
-		if ec := msgClient.Connect(); ec != nil {
-			conf.Log.Fatal(ec)
-		} else {
-			//log.Infof("The connection to edgex messagebus is established successfully.")
-			messages := make(chan types.MessageEnvelope)
-			topics := []types.TopicChannel{{Topic: "", Messages: messages}}
-			err := make(chan error)
-			if e := msgClient.Subscribe(topics, err); e != nil {
-				//log.Errorf("Failed to subscribe to edgex messagebus topic %s.\n", e)
-				conf.Log.Fatal(e)
-			} else {
-				var count = 0
-				for {
-					select {
-					case e1 := <-err:
-						conf.Log.Errorf("%s\n", e1)
-						return
-					case env := <-messages:
-						count++
-						fmt.Printf("%s\n", env.Payload)
-						if count == 1 {
-							return
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
 func subEventsFromMQTT(host string) {
 	var msgConfig1 = types.MessageBusConfig{
-		SubscribeHost: types.HostInfo{
+		Broker: types.HostInfo{
 			Host:     host,
 			Port:     1883,
 			Protocol: "tcp",
@@ -113,7 +70,7 @@ func subEventsFromMQTT(host string) {
 
 func subEventsFromRedis(host string) {
 	var msgConfig1 = types.MessageBusConfig{
-		SubscribeHost: types.HostInfo{
+		Broker: types.HostInfo{
 			Host:     host,
 			Port:     6379,
 			Protocol: "redis",
@@ -155,9 +112,7 @@ func subEventsFromRedis(host string) {
 }
 
 func main() {
-	if len(os.Args) == 1 {
-		subEventsFromZMQ()
-	} else if len(os.Args) == 3 {
+	if len(os.Args) == 3 {
 		if v := os.Args[1]; v == "mqtt" {
 			subEventsFromMQTT(os.Args[2])
 		}

+ 15 - 39
test/edgex_array_rule.jmx

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2021 EMQ Technologies Co., Ltd.
+  ~ Copyright 2023 EMQ Technologies Co., Ltd.
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -64,6 +64,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -114,7 +115,7 @@
                 <elementProp name="" elementType="HTTPArgument">
                   <boolProp name="HTTPArgument.always_encode">false</boolProp>
                   <stringProp name="Argument.value">{&#xd;
-&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;zmq_conf\&quot;)&quot;&#xd;
+&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;redis_conf\&quot;)&quot;&#xd;
 }</stringProp>
                   <stringProp name="Argument.metadata">=</stringProp>
                 </elementProp>
@@ -200,15 +201,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -255,15 +249,8 @@
           </SystemSampler>
           <hashTree/>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -304,15 +291,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_DropRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -341,15 +321,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_Drop_Stream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -394,6 +367,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -454,6 +428,8 @@
             <stringProp name="mqtt.conn_keep_alive">300</stringProp>
             <stringProp name="mqtt.conn_attampt_max">0</stringProp>
             <stringProp name="mqtt.reconn_attampt_max">0</stringProp>
+            <stringProp name="mqtt.ws_path"></stringProp>
+            <stringProp name="mqtt.conn_clean_session">true</stringProp>
           </net.xmeter.samplers.ConnectSampler>
           <hashTree/>
         </hashTree>
@@ -490,4 +466,4 @@
       </hashTree>
     </hashTree>
   </hashTree>
-</jmeterTestPlan>
+</jmeterTestPlan>

+ 30 - 35
test/edgex_redis_share_connection_sink_rule.jmx

@@ -1,5 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3">
+<!--
+  ~ Copyright 2023 EMQ Technologies Co., Ltd.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.5">
   <hashTree>
     <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
       <stringProp name="TestPlan.comments"></stringProp>
@@ -139,7 +154,7 @@
                   <boolProp name="HTTPArgument.always_encode">false</boolProp>
                   <stringProp name="Argument.value">{&#xd;
   &quot;id&quot;: &quot;rule1&quot;,&#xd;
-  &quot;sql&quot;: &quot;SELECT meta(*) AS edgex_meta, temperature, humidity, humidity*2 as h1 FROM demo WHERE temperature = 20&quot;,&#xd;
+  &quot;sql&quot;: &quot;SELECT temperature, Humidity, meta(*) AS edgex_meta FROM demo WHERE temperature = 72&quot;,&#xd;
   &quot;actions&quot;: [&#xd;
     {&#xd;
       &quot;edgex&quot;: {&#xd;
@@ -219,18 +234,7 @@
             <stringProp name="SystemSampler.expectedReturnCode">0</stringProp>
             <stringProp name="SystemSampler.command">test/edgex/pub</stringProp>
             <elementProp name="SystemSampler.arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="Argument">
-                  <stringProp name="Argument.name"></stringProp>
-                  <stringProp name="Argument.value">redis</stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-                <elementProp name="" elementType="Argument">
-                  <stringProp name="Argument.name"></stringProp>
-                  <stringProp name="Argument.value">${redis_srv}</stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <elementProp name="SystemSampler.environment" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
               <collectionProp name="Arguments.arguments"/>
@@ -259,7 +263,7 @@
           <hashTree>
             <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="JSON Assertion" enabled="true">
               <stringProp name="JSON_PATH">$.source_demo_0_records_in_total</stringProp>
-              <stringProp name="EXPECTED_VALUE">1</stringProp>
+              <stringProp name="EXPECTED_VALUE">10</stringProp>
               <boolProp name="JSONVALIDATION">true</boolProp>
               <boolProp name="EXPECT_NULL">false</boolProp>
               <boolProp name="INVERT">false</boolProp>
@@ -422,43 +426,34 @@
         <hashTree>
           <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="device Assertion" enabled="true">
             <stringProp name="JSON_PATH">$.event.deviceName</stringProp>
-            <stringProp name="EXPECTED_VALUE">demo1</stringProp>
+            <stringProp name="EXPECTED_VALUE">demo</stringProp>
             <boolProp name="JSONVALIDATION">true</boolProp>
             <boolProp name="EXPECT_NULL">false</boolProp>
             <boolProp name="INVERT">false</boolProp>
             <boolProp name="ISREGEX">false</boolProp>
           </JSONPathAssertion>
           <hashTree/>
-          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="reading_0 Assertion" enabled="true">
-            <stringProp name="JSON_PATH">$.event.readings[0].value</stringProp>
-            <stringProp name="EXPECTED_VALUE">30</stringProp>
-            <boolProp name="JSONVALIDATION">false</boolProp>
-            <boolProp name="EXPECT_NULL">false</boolProp>
-            <boolProp name="INVERT">false</boolProp>
-            <boolProp name="ISREGEX">false</boolProp>
-          </JSONPathAssertion>
-          <hashTree/>
-          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="reading_1 Assertion" enabled="true">
+          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="Humidity value Assertion" enabled="true">
             <stringProp name="JSON_PATH">$.event.readings[1].value</stringProp>
-            <stringProp name="EXPECTED_VALUE">20</stringProp>
+            <stringProp name="EXPECTED_VALUE">81</stringProp>
             <boolProp name="JSONVALIDATION">false</boolProp>
             <boolProp name="EXPECT_NULL">false</boolProp>
             <boolProp name="INVERT">false</boolProp>
             <boolProp name="ISREGEX">false</boolProp>
           </JSONPathAssertion>
           <hashTree/>
-          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="reading_2 Assertion" enabled="true">
-            <stringProp name="JSON_PATH">$.event.readings[2].value</stringProp>
-            <stringProp name="EXPECTED_VALUE">20</stringProp>
+          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="temperature value Assertion" enabled="true">
+            <stringProp name="JSON_PATH">$.event.readings[0].value</stringProp>
+            <stringProp name="EXPECTED_VALUE">72</stringProp>
             <boolProp name="JSONVALIDATION">false</boolProp>
             <boolProp name="EXPECT_NULL">false</boolProp>
             <boolProp name="INVERT">false</boolProp>
             <boolProp name="ISREGEX">false</boolProp>
           </JSONPathAssertion>
           <hashTree/>
-          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="temperature name assertion" enabled="true">
+          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Humidity name assertion" enabled="true">
             <collectionProp name="Asserion.test_strings">
-              <stringProp name="321701236">temperature</stringProp>
+              <stringProp name="612671699">Humidity</stringProp>
             </collectionProp>
             <stringProp name="Assertion.custom_message"></stringProp>
             <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
@@ -466,9 +461,9 @@
             <intProp name="Assertion.test_type">2</intProp>
           </ResponseAssertion>
           <hashTree/>
-          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="humidity name assertion" enabled="true">
+          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="temperature name assertion" enabled="true">
             <collectionProp name="Asserion.test_strings">
-              <stringProp name="548027571">humidity</stringProp>
+              <stringProp name="321701236">temperature</stringProp>
             </collectionProp>
             <stringProp name="Assertion.custom_message"></stringProp>
             <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
@@ -480,4 +475,4 @@
       </hashTree>
     </hashTree>
   </hashTree>
-</jmeterTestPlan>
+</jmeterTestPlan>

+ 30 - 45
test/edgex_sink_rule.jmx

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2021 EMQ Technologies Co., Ltd.
+  ~ Copyright 2023 EMQ Technologies Co., Ltd.
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -59,6 +59,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -109,7 +110,7 @@
                 <elementProp name="" elementType="HTTPArgument">
                   <boolProp name="HTTPArgument.always_encode">false</boolProp>
                   <stringProp name="Argument.value">{&#xd;
-&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;zmq_conf\&quot;)&quot;&#xd;
+&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;redis_conf\&quot;)&quot;&#xd;
 }</stringProp>
                   <stringProp name="Argument.metadata">=</stringProp>
                 </elementProp>
@@ -153,11 +154,11 @@
   &quot;actions&quot;: [&#xd;
     {&#xd;
       &quot;edgex&quot;: {&#xd;
-        &quot;protocol&quot;: &quot;tcp&quot;,&#xd;
-        &quot;host&quot;: &quot;*&quot;,&#xd;
-        &quot;port&quot;: 5571,&#xd;
-        &quot;type&quot;: &quot;zero&quot;,&#xd;
-        &quot;topic&quot;: &quot;application&quot;,&#xd;
+        &quot;protocol&quot;: &quot;redis&quot;,&#xd;
+        &quot;host&quot;: &quot;127.0.0.1&quot;,&#xd;
+        &quot;port&quot;: 6379,&#xd;
+        &quot;type&quot;: &quot;redis&quot;,&#xd;
+        &quot;topic&quot;: &quot;result&quot;,&#xd;
         &quot;metadata&quot;: &quot;metadt&quot;,&#xd;
         &quot;contentType&quot;: &quot;application/json&quot;&#xd;
       }&#xd;
@@ -195,15 +196,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -244,15 +238,8 @@
           </SystemSampler>
           <hashTree/>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -293,15 +280,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_DropRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -330,15 +310,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_Drop_Stream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -383,6 +356,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -426,7 +400,18 @@
           <stringProp name="SystemSampler.expectedReturnCode">0</stringProp>
           <stringProp name="SystemSampler.command">test/edgex/sub/sub</stringProp>
           <elementProp name="SystemSampler.arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-            <collectionProp name="Arguments.arguments"/>
+            <collectionProp name="Arguments.arguments">
+              <elementProp name="" elementType="Argument">
+                <stringProp name="Argument.name"></stringProp>
+                <stringProp name="Argument.value">redis</stringProp>
+                <stringProp name="Argument.metadata">=</stringProp>
+              </elementProp>
+              <elementProp name="" elementType="Argument">
+                <stringProp name="Argument.name"></stringProp>
+                <stringProp name="Argument.value">127.0.0.1</stringProp>
+                <stringProp name="Argument.metadata">=</stringProp>
+              </elementProp>
+            </collectionProp>
           </elementProp>
           <elementProp name="SystemSampler.environment" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
             <collectionProp name="Arguments.arguments"/>
@@ -485,4 +470,4 @@
       </hashTree>
     </hashTree>
   </hashTree>
-</jmeterTestPlan>
+</jmeterTestPlan>

+ 3 - 6
test/run_jmeter.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright 2021-2022 EMQ Technologies Co., Ltd.
+# Copyright 2021-2023 EMQ Technologies Co., Ltd.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -90,12 +90,9 @@ if test $with_edgex = true; then
   /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/select_edgex_condition_rule.jmx -Dbase="$base_dir" -Dfvt="$fvt_dir" -l jmeter_logs/select_edgex_condition_rule.jtl -j jmeter_logs/select_edgex_condition_rule.log
   echo -e "---------------------------------------------\n"
 
-  /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/select_edgex_another_bus_rule.jmx -Dfvt="$fvt_dir" -l jmeter_logs/select_edgex_another_bus_rule.jtl -j jmeter_logs/select_edgex_another_bus_rule.log
-  echo -e "---------------------------------------------\n"
-
   /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/edgex_sink_rule.jmx -Dfvt="$fvt_dir" -l jmeter_logs/edgex_sink_rule.jtl -j jmeter_logs/edgex_sink_rule.log
   echo -e "---------------------------------------------\n"
-  
+
   /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/select_edgex_meta_rule.jmx -Dfvt="$fvt_dir" -l jmeter_logs/select_edgex_meta_rule.jtl -j jmeter_logs/select_edgex_meta_rule.log
   echo -e "---------------------------------------------\n"
 
@@ -166,4 +163,4 @@ echo -e "-------------------- management test ------------------------\n"
 /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/management_test/data_import_export.jmx -Dfvt="$fvt_dir" -l jmeter_logs/data_import_export.jtl -j jmeter_logs/data_import_export.log
 echo -e "---------------------------------------------\n"
 /opt/jmeter/bin/jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t test/management_test/rule_metrics.jmx -Dfvt="$fvt_dir" -l jmeter_logs/rule_metrics.jtl -j jmeter_logs/rule_metrics.log
-echo -e "---------------------------------------------\n"
+echo -e "---------------------------------------------\n"

+ 0 - 510
test/select_edgex_another_bus_rule.jmx

@@ -1,510 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2021 EMQ Technologies Co., Ltd.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<jmeterTestPlan version="1.2" properties="4.0" jmeter="4.0 r1823414">
-  <hashTree>
-    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
-      <stringProp name="TestPlan.comments"></stringProp>
-      <boolProp name="TestPlan.functional_mode">false</boolProp>
-      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
-      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
-      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-        <collectionProp name="Arguments.arguments"/>
-      </elementProp>
-      <stringProp name="TestPlan.user_define_classpath"></stringProp>
-    </TestPlan>
-    <hashTree>
-      <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-        <collectionProp name="Arguments.arguments">
-          <elementProp name="srv" elementType="Argument">
-            <stringProp name="Argument.name">srv</stringProp>
-            <stringProp name="Argument.value">127.0.0.1</stringProp>
-            <stringProp name="Argument.metadata">=</stringProp>
-          </elementProp>
-          <elementProp name="rest_port" elementType="Argument">
-            <stringProp name="Argument.name">rest_port</stringProp>
-            <stringProp name="Argument.value">9081</stringProp>
-            <stringProp name="Argument.metadata">=</stringProp>
-          </elementProp>
-          <elementProp name="fvt" elementType="Argument">
-            <stringProp name="Argument.name">fvt</stringProp>
-            <stringProp name="Argument.value">${__property(fvt,,)}</stringProp>
-            <stringProp name="Argument.metadata">=</stringProp>
-          </elementProp>
-          <elementProp name="mqtt_srv" elementType="Argument">
-            <stringProp name="Argument.name">mqtt_srv</stringProp>
-            <stringProp name="Argument.value">127.0.0.1</stringProp>
-            <stringProp name="Argument.metadata">=</stringProp>
-          </elementProp>
-        </collectionProp>
-      </Arguments>
-      <hashTree/>
-      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Rules" enabled="true">
-        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
-        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
-          <boolProp name="LoopController.continue_forever">false</boolProp>
-          <stringProp name="LoopController.loops">1</stringProp>
-        </elementProp>
-        <stringProp name="ThreadGroup.num_threads">1</stringProp>
-        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
-        <boolProp name="ThreadGroup.scheduler">false</boolProp>
-        <stringProp name="ThreadGroup.duration"></stringProp>
-        <stringProp name="ThreadGroup.delay"></stringProp>
-      </ThreadGroup>
-      <hashTree>
-        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
-          <boolProp name="ResultCollector.error_logging">false</boolProp>
-          <objProp>
-            <name>saveConfig</name>
-            <value class="SampleSaveConfiguration">
-              <time>true</time>
-              <latency>true</latency>
-              <timestamp>true</timestamp>
-              <success>true</success>
-              <label>true</label>
-              <code>true</code>
-              <message>true</message>
-              <threadName>true</threadName>
-              <dataType>true</dataType>
-              <encoding>false</encoding>
-              <assertions>true</assertions>
-              <subresults>true</subresults>
-              <responseData>false</responseData>
-              <samplerData>false</samplerData>
-              <xml>false</xml>
-              <fieldNames>true</fieldNames>
-              <responseHeaders>false</responseHeaders>
-              <requestHeaders>false</requestHeaders>
-              <responseDataOnError>false</responseDataOnError>
-              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
-              <assertionsResultsToSave>0</assertionsResultsToSave>
-              <bytes>true</bytes>
-              <sentBytes>true</sentBytes>
-              <threadCounts>true</threadCounts>
-              <idleTime>true</idleTime>
-              <connectTime>true</connectTime>
-            </value>
-          </objProp>
-          <stringProp name="filename"></stringProp>
-        </ResultCollector>
-        <hashTree/>
-        <TransactionController guiclass="TransactionControllerGui" testclass="TransactionController" testname="API" enabled="true">
-          <boolProp name="TransactionController.includeTimers">false</boolProp>
-          <boolProp name="TransactionController.parent">false</boolProp>
-        </TransactionController>
-        <hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_CreateStream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value">{&#xd;
-&quot;sql&quot; : &quot;create stream application () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;, CONF_KEY=\&quot;application_conf\&quot;)&quot;&#xd;
-}</stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/streams</stringProp>
-            <stringProp name="HTTPSampler.method">POST</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
-              <collectionProp name="Asserion.test_strings">
-                <stringProp name="-1625239252">Stream application is created.</stringProp>
-              </collectionProp>
-              <stringProp name="Assertion.custom_message"></stringProp>
-              <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
-              <boolProp name="Assertion.assume_success">true</boolProp>
-              <intProp name="Assertion.test_type">16</intProp>
-            </ResponseAssertion>
-            <hashTree/>
-          </hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_CreateRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value">{&#xd;
-  &quot;id&quot;: &quot;rule1&quot;,&#xd;
-  &quot;sql&quot;: &quot;SELECT * FROM application&quot;,&#xd;
-  &quot;actions&quot;: [&#xd;
-    {&#xd;
-      &quot;mqtt&quot;: {&#xd;
-        &quot;server&quot;: &quot;tcp://${mqtt_srv}:1883&quot;,&#xd;
-        &quot;topic&quot;: &quot;devices/result&quot;,&#xd;
-        &quot;qos&quot;: 1,&#xd;
-        &quot;clientId&quot;: &quot;demo_001&quot;&#xd;
-      }&#xd;
-    }&#xd;
-  ]&#xd;
-}</stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/rules</stringProp>
-            <stringProp name="HTTPSampler.method">POST</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
-              <collectionProp name="Asserion.test_strings">
-                <stringProp name="-2022196798">Rule rule1 was created</stringProp>
-              </collectionProp>
-              <stringProp name="Assertion.custom_message"></stringProp>
-              <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
-              <boolProp name="Assertion.assume_success">true</boolProp>
-              <intProp name="Assertion.test_type">16</intProp>
-            </ResponseAssertion>
-            <hashTree/>
-          </hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/rules/rule1/status</stringProp>
-            <stringProp name="HTTPSampler.method">GET</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="JSON Assertion" enabled="true">
-              <stringProp name="JSON_PATH">$.source_application_0_records_in_total</stringProp>
-              <stringProp name="EXPECTED_VALUE">0</stringProp>
-              <boolProp name="JSONVALIDATION">true</boolProp>
-              <boolProp name="EXPECT_NULL">false</boolProp>
-              <boolProp name="INVERT">false</boolProp>
-              <boolProp name="ISREGEX">false</boolProp>
-            </JSONPathAssertion>
-            <hashTree/>
-          </hashTree>
-          <SystemSampler guiclass="SystemSamplerGui" testclass="SystemSampler" testname="OS Process Sampler" enabled="true">
-            <boolProp name="SystemSampler.checkReturnCode">false</boolProp>
-            <stringProp name="SystemSampler.expectedReturnCode">0</stringProp>
-            <stringProp name="SystemSampler.command">test/edgex/pub</stringProp>
-            <elementProp name="SystemSampler.arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="Argument">
-                  <stringProp name="Argument.name"></stringProp>
-                  <stringProp name="Argument.value">another</stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <elementProp name="SystemSampler.environment" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
-              <collectionProp name="Arguments.arguments"/>
-            </elementProp>
-            <stringProp name="SystemSampler.directory">${__property(fvt,,)}</stringProp>
-          </SystemSampler>
-          <hashTree>
-            <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="响应断言" enabled="true">
-              <collectionProp name="Asserion.test_strings">
-                <stringProp name="-1026534321">pubToAnother successful</stringProp>
-              </collectionProp>
-              <stringProp name="Assertion.custom_message"></stringProp>
-              <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
-              <boolProp name="Assertion.assume_success">false</boolProp>
-              <intProp name="Assertion.test_type">16</intProp>
-            </ResponseAssertion>
-            <hashTree/>
-            <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
-              <stringProp name="ConstantTimer.delay">1000</stringProp>
-            </ConstantTimer>
-            <hashTree/>
-            <BeanShellPostProcessor guiclass="TestBeanGUI" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true">
-              <boolProp name="resetInterpreter">false</boolProp>
-              <stringProp name="parameters"></stringProp>
-              <stringProp name="filename"></stringProp>
-              <stringProp name="script">System.out.println(prev.getResponseDataAsString());</stringProp>
-            </BeanShellPostProcessor>
-            <hashTree/>
-          </hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/rules/rule1/status</stringProp>
-            <stringProp name="HTTPSampler.method">GET</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="JSON Assertion" enabled="true">
-              <stringProp name="JSON_PATH">$.source_application_0_records_in_total</stringProp>
-              <stringProp name="EXPECTED_VALUE">1</stringProp>
-              <boolProp name="JSONVALIDATION">true</boolProp>
-              <boolProp name="EXPECT_NULL">false</boolProp>
-              <boolProp name="INVERT">false</boolProp>
-              <boolProp name="ISREGEX">false</boolProp>
-            </JSONPathAssertion>
-            <hashTree/>
-            <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="JSON Assertion" enabled="false">
-              <stringProp name="JSON_PATH">$.sink_mqtt_0_0_records_in_total</stringProp>
-              <stringProp name="EXPECTED_VALUE">6</stringProp>
-              <boolProp name="JSONVALIDATION">true</boolProp>
-              <boolProp name="EXPECT_NULL">false</boolProp>
-              <boolProp name="INVERT">false</boolProp>
-              <boolProp name="ISREGEX">false</boolProp>
-            </JSONPathAssertion>
-            <hashTree/>
-            <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
-              <stringProp name="ConstantTimer.delay">3000</stringProp>
-            </ConstantTimer>
-            <hashTree/>
-          </hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_DropRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/rules/rule1</stringProp>
-            <stringProp name="HTTPSampler.method">DELETE</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
-              <collectionProp name="Asserion.test_strings">
-                <stringProp name="717250485">Rule rule1 is dropped.</stringProp>
-              </collectionProp>
-              <stringProp name="Assertion.custom_message"></stringProp>
-              <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
-              <boolProp name="Assertion.assume_success">false</boolProp>
-              <intProp name="Assertion.test_type">16</intProp>
-            </ResponseAssertion>
-            <hashTree/>
-          </hashTree>
-          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_Drop_Stream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
-            </elementProp>
-            <stringProp name="HTTPSampler.domain">${srv}</stringProp>
-            <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
-            <stringProp name="HTTPSampler.protocol"></stringProp>
-            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
-            <stringProp name="HTTPSampler.path">/streams/application</stringProp>
-            <stringProp name="HTTPSampler.method">DELETE</stringProp>
-            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
-            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
-            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
-            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
-            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
-            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
-            <stringProp name="HTTPSampler.response_timeout"></stringProp>
-          </HTTPSamplerProxy>
-          <hashTree>
-            <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
-              <collectionProp name="Asserion.test_strings">
-                <stringProp name="417596244">Stream application is dropped.</stringProp>
-              </collectionProp>
-              <stringProp name="Assertion.custom_message"></stringProp>
-              <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
-              <boolProp name="Assertion.assume_success">false</boolProp>
-              <intProp name="Assertion.test_type">16</intProp>
-            </ResponseAssertion>
-            <hashTree/>
-          </hashTree>
-          <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
-            <stringProp name="ConstantTimer.delay">1000</stringProp>
-          </ConstantTimer>
-          <hashTree/>
-        </hashTree>
-      </hashTree>
-      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Result" enabled="true">
-        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
-        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
-          <boolProp name="LoopController.continue_forever">false</boolProp>
-          <stringProp name="LoopController.loops">1</stringProp>
-        </elementProp>
-        <stringProp name="ThreadGroup.num_threads">1</stringProp>
-        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
-        <boolProp name="ThreadGroup.scheduler">false</boolProp>
-        <stringProp name="ThreadGroup.duration"></stringProp>
-        <stringProp name="ThreadGroup.delay"></stringProp>
-      </ThreadGroup>
-      <hashTree>
-        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
-          <boolProp name="ResultCollector.error_logging">false</boolProp>
-          <objProp>
-            <name>saveConfig</name>
-            <value class="SampleSaveConfiguration">
-              <time>true</time>
-              <latency>true</latency>
-              <timestamp>true</timestamp>
-              <success>true</success>
-              <label>true</label>
-              <code>true</code>
-              <message>true</message>
-              <threadName>true</threadName>
-              <dataType>true</dataType>
-              <encoding>false</encoding>
-              <assertions>true</assertions>
-              <subresults>true</subresults>
-              <responseData>false</responseData>
-              <samplerData>false</samplerData>
-              <xml>false</xml>
-              <fieldNames>true</fieldNames>
-              <responseHeaders>false</responseHeaders>
-              <requestHeaders>false</requestHeaders>
-              <responseDataOnError>false</responseDataOnError>
-              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
-              <assertionsResultsToSave>0</assertionsResultsToSave>
-              <bytes>true</bytes>
-              <sentBytes>true</sentBytes>
-              <threadCounts>true</threadCounts>
-              <idleTime>true</idleTime>
-              <connectTime>true</connectTime>
-            </value>
-          </objProp>
-          <stringProp name="filename"></stringProp>
-        </ResultCollector>
-        <hashTree/>
-        <OnceOnlyController guiclass="OnceOnlyControllerGui" testclass="OnceOnlyController" testname="Once Only Controller" enabled="true"/>
-        <hashTree>
-          <net.xmeter.samplers.ConnectSampler guiclass="net.xmeter.gui.ConnectSamplerUI" testclass="net.xmeter.samplers.ConnectSampler" testname="MQTT Connect" enabled="true">
-            <stringProp name="mqtt.server">${mqtt_srv}</stringProp>
-            <stringProp name="mqtt.port">1883</stringProp>
-            <stringProp name="mqtt.version">3.1</stringProp>
-            <stringProp name="mqtt.conn_timeout">10</stringProp>
-            <boolProp name="mqtt.private_protocol">false</boolProp>
-            <stringProp name="mqtt.listener_timeout">10</stringProp>
-            <stringProp name="mqtt.protocol">TCP</stringProp>
-            <boolProp name="mqtt.dual_ssl_authentication">false</boolProp>
-            <stringProp name="mqtt.keystore_file_path"></stringProp>
-            <stringProp name="mqtt.keystore_password"></stringProp>
-            <stringProp name="mqtt.clientcert_file_path"></stringProp>
-            <stringProp name="mqtt.clientcert_password"></stringProp>
-            <stringProp name="mqtt.user_name"></stringProp>
-            <stringProp name="mqtt.password"></stringProp>
-            <stringProp name="mqtt.client_id_prefix">conn_</stringProp>
-            <boolProp name="mqtt.client_id_suffix">true</boolProp>
-            <stringProp name="mqtt.conn_keep_alive">300</stringProp>
-            <stringProp name="mqtt.conn_attampt_max">0</stringProp>
-            <stringProp name="mqtt.reconn_attampt_max">0</stringProp>
-          </net.xmeter.samplers.ConnectSampler>
-          <hashTree/>
-        </hashTree>
-        <net.xmeter.samplers.SubSampler guiclass="net.xmeter.gui.SubSamplerUI" testclass="net.xmeter.samplers.SubSampler" testname="AnalysisResult" enabled="true">
-          <stringProp name="mqtt.topic_name">devices/result</stringProp>
-          <stringProp name="mqtt.qos_level">0</stringProp>
-          <boolProp name="mqtt.add_timestamp">false</boolProp>
-          <boolProp name="mqtt.debug_response">true</boolProp>
-          <stringProp name="mqtt.sample_condition">number of received messages</stringProp>
-          <stringProp name="mqtt.sample_condition_value">1</stringProp>
-        </net.xmeter.samplers.SubSampler>
-        <hashTree>
-          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="temperature Assertion" enabled="true">
-            <stringProp name="JSON_PATH">$[0].Temperature</stringProp>
-            <stringProp name="EXPECTED_VALUE"></stringProp>
-            <boolProp name="JSONVALIDATION">false</boolProp>
-            <boolProp name="EXPECT_NULL">false</boolProp>
-            <boolProp name="INVERT">false</boolProp>
-            <boolProp name="ISREGEX">false</boolProp>
-          </JSONPathAssertion>
-          <hashTree/>
-          <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="humidity Assertion" enabled="true">
-            <stringProp name="JSON_PATH">$[0].Humidity</stringProp>
-            <stringProp name="EXPECTED_VALUE"></stringProp>
-            <boolProp name="JSONVALIDATION">false</boolProp>
-            <boolProp name="EXPECT_NULL">false</boolProp>
-            <boolProp name="INVERT">false</boolProp>
-            <boolProp name="ISREGEX">false</boolProp>
-          </JSONPathAssertion>
-          <hashTree/>
-        </hashTree>
-      </hashTree>
-    </hashTree>
-  </hashTree>
-</jmeterTestPlan>

+ 15 - 39
test/select_edgex_condition_rule.jmx

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2021 EMQ Technologies Co., Ltd.
+  ~ Copyright 2023 EMQ Technologies Co., Ltd.
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -64,6 +64,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -114,7 +115,7 @@
                 <elementProp name="" elementType="HTTPArgument">
                   <boolProp name="HTTPArgument.always_encode">false</boolProp>
                   <stringProp name="Argument.value">{&#xd;
-&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;zmq_conf\&quot;)&quot;&#xd;
+&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;redis_conf\&quot;)&quot;&#xd;
 }</stringProp>
                   <stringProp name="Argument.metadata">=</stringProp>
                 </elementProp>
@@ -197,15 +198,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -246,15 +240,8 @@
           </SystemSampler>
           <hashTree/>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -295,15 +282,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_DropRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -332,15 +312,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_Drop_Stream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -385,6 +358,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -445,6 +419,8 @@
             <stringProp name="mqtt.conn_keep_alive">300</stringProp>
             <stringProp name="mqtt.conn_attampt_max">0</stringProp>
             <stringProp name="mqtt.reconn_attampt_max">0</stringProp>
+            <stringProp name="mqtt.ws_path"></stringProp>
+            <stringProp name="mqtt.conn_clean_session">true</stringProp>
           </net.xmeter.samplers.ConnectSampler>
           <hashTree/>
         </hashTree>
@@ -505,4 +481,4 @@ if(temp &lt;= 30) {
       </hashTree>
     </hashTree>
   </hashTree>
-</jmeterTestPlan>
+</jmeterTestPlan>

+ 15 - 39
test/select_edgex_meta_rule.jmx

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2021 EMQ Technologies Co., Ltd.
+  ~ Copyright 2023 EMQ Technologies Co., Ltd.
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -64,6 +64,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -114,7 +115,7 @@
                 <elementProp name="" elementType="HTTPArgument">
                   <boolProp name="HTTPArgument.always_encode">false</boolProp>
                   <stringProp name="Argument.value">{&#xd;
-&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;zmq_conf\&quot;)&quot;&#xd;
+&quot;sql&quot; : &quot;create stream demo () WITH (FORMAT=\&quot;JSON\&quot;, TYPE=\&quot;edgex\&quot;,Conf_key=\&quot;redis_conf\&quot;)&quot;&#xd;
 }</stringProp>
                   <stringProp name="Argument.metadata">=</stringProp>
                 </elementProp>
@@ -197,15 +198,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -252,15 +246,8 @@
           </SystemSampler>
           <hashTree/>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_GetRuleStatus" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -301,15 +288,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_DropRule" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -338,15 +318,8 @@
             <hashTree/>
           </hashTree>
           <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API_Drop_Stream" enabled="true">
-            <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
-            <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
-              <collectionProp name="Arguments.arguments">
-                <elementProp name="" elementType="HTTPArgument">
-                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
-                  <stringProp name="Argument.value"></stringProp>
-                  <stringProp name="Argument.metadata">=</stringProp>
-                </elementProp>
-              </collectionProp>
+            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
             </elementProp>
             <stringProp name="HTTPSampler.domain">${srv}</stringProp>
             <stringProp name="HTTPSampler.port">${rest_port}</stringProp>
@@ -391,6 +364,7 @@
         <boolProp name="ThreadGroup.scheduler">false</boolProp>
         <stringProp name="ThreadGroup.duration"></stringProp>
         <stringProp name="ThreadGroup.delay"></stringProp>
+        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
       </ThreadGroup>
       <hashTree>
         <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
@@ -451,6 +425,8 @@
             <stringProp name="mqtt.conn_keep_alive">300</stringProp>
             <stringProp name="mqtt.conn_attampt_max">0</stringProp>
             <stringProp name="mqtt.reconn_attampt_max">0</stringProp>
+            <stringProp name="mqtt.ws_path"></stringProp>
+            <stringProp name="mqtt.conn_clean_session">true</stringProp>
           </net.xmeter.samplers.ConnectSampler>
           <hashTree/>
         </hashTree>
@@ -521,4 +497,4 @@
       </hashTree>
     </hashTree>
   </hashTree>
-</jmeterTestPlan>
+</jmeterTestPlan>