This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 2ad2b6d [ISSUE #2176] Fix the bug of websocket plugin (#2180)
2ad2b6d is described below
commit 2ad2b6de288f299a3da4bcc5c3d4ad40f9af8d2a
Author: Kunshuai Zhu <[email protected]>
AuthorDate: Wed Sep 29 21:48:19 2021 -0500
[ISSUE #2176] Fix the bug of websocket plugin (#2180)
* Fix the bug of websocket plugin
* re-run ci
---
.../src/main/resources/sql-script/h2/schema.sql | 23 +++++++++++-----------
.../src/main/resources/sql-script/mysql/schema.sql | 23 +++++++++++-----------
shenyu-bootstrap/pom.xml | 10 +++++++++-
3 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
b/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
index bf1b2ad..3f034c4 100644
--- a/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
+++ b/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
@@ -340,7 +340,7 @@ INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`,
`config`, `enabled`,
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `config`,
`enabled`, `date_created`, `date_updated`) VALUES ('23', 'modifyResponse',
'http process', 220, '{"ruleHandlePageType":"custom"}', '0', '2021-05-30
21:26:37', '2021-05-30 23:26:11');
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('24', 'cryptor_request', 'cryptor',
100, '1', '2021-08-06 13:55:21', '2021-08-17 16:35:41');
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('25', 'cryptor_response', 'cryptor',
410, '1', '2021-08-06 13:55:30', '2021-08-13 16:03:40');
-INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('26', 'websocket', 'proxy', 200, '1',
'2021-08-27 13:55:30', '2021-08-27 16:03:40');
+INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `config`,
`enabled`, `date_created`, `date_updated`) VALUES ('26', 'websocket', 'proxy',
200, '{"multiSelectorHandle":"1"}', '1', '2021-08-27 13:55:30', '2021-08-27
16:03:40');
/*insert plugin_handle data for sentinel*/
INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1','10' ,'flowRuleGrade','flowRuleGrade','3', 2, 8,
'{"required":"1","defaultValue":"1","rule":""}', '2020-11-09 01:19:10',
'2020-11-09 01:19:10');
@@ -466,16 +466,17 @@ INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`
INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('110', '25', 'fieldNames', 'fieldNames', 2, 2, 4, NULL, '2021-08-13
15:16:30', '2021-08-13 15:16:45');
/*insert plugin_handle data for websocket*/
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1000', '26', 'host', 'host', 2, 1, 0, null, '2021-08-27 21:23:41',
'2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1001', '26', 'protocol', 'protocol', 2, 1, 2,
'{"required":"0","defaultValue":"","placeholder":"ws://","rule":""}',
'2021-08-27 21:25:37', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1002', '26', 'url', 'ip:port', 2, 1, 1,
'{"required":"1","placeholder":"","rule":""}', '2021-08-27 21:25:55',
'2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1003', '26', 'weight', 'weight', 1, 1, 3,
'{"defaultValue":"50","rule":""}', '2021-08-27 21:26:35', '2021-08-27
10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1004', '26', 'timestamp', 'startupTime', 1, 1, 3,
'{"defaultValue":"0","placeholder":"startup timestamp","rule":""}', '2021-08-27
21:27:11', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1005', '26', 'warmup', 'warmupTime', 1, 1, 5,
'{"defaultValue":"0","placeholder":"warmup time (ms)","rule":""}', '2021-08-27
21:27:34', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1006', '26', 'status', 'status', 3, 1, 6,
'{"defaultValue":"true","rule":""}', '2021-08-27 21:29:16', '2021-08-27
10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1007', '26', 'loadBalance', 'loadStrategy', 3, 2, 0, null,
'2021-08-27 21:30:32', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1008', '26', 'retry', 'retryCount', 1, 2, 1, null, '2021-08-27
21:31:00', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1009', '26', 'timeout', 'timeout', 1, 2, 2,
'{"defaultValue":"3000","rule":""}', '2021-08-27 21:13:50', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2000', '26', 'host', 'host', 2, 1, 0, null, '2021-08-27 21:23:41',
'2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2001', '26', 'protocol', 'protocol', 2, 1, 2,
'{"required":"0","defaultValue":"","placeholder":"ws://","rule":""}',
'2021-08-27 21:25:37', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2002', '26', 'url', 'ip:port', 2, 1, 1,
'{"required":"1","placeholder":"","rule":""}', '2021-08-27 21:25:55',
'2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2003', '26', 'weight', 'weight', 1, 1, 3,
'{"defaultValue":"50","rule":""}', '2021-08-27 21:26:35', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2004', '26', 'timestamp', 'startupTime', 1, 1, 3,
'{"defaultValue":"0","placeholder":"startup timestamp","rule":""}', '2021-08-27
21:27:11', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2005', '26', 'warmup', 'warmupTime', 1, 1, 5,
'{"defaultValue":"0","placeholder":"warmup time (ms)","rule":""}', '2021-08-27
21:27:34', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2006', '26', 'status', 'status', 3, 1, 6,
'{"defaultValue":"true","rule":""}', '2021-08-27 21:29:16', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2007', '26', 'loadBalance', 'loadStrategy', 3, 2, 0, null,
'2021-08-27 21:30:32', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2008', '26', 'retry', 'retryCount', 1, 2, 1, null, '2021-08-27
21:31:00', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2009', '26', 'timeout', 'timeout', 1, 2, 2,
'{"defaultValue":"3000","rule":""}', '2021-08-27 21:13:50', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2010', '26', 'multiSelectorHandle', 'multiSelectorHandle', 3, 3, 0,
null, '2021-08-27 21:30:32', '2021-08-27 10:32:51');
/*insert plugin_handle data for dubbo*/
INSERT IGNORE INTO plugin_handle (`id`, `plugin_id`, `field`, `label`,
`data_type`, `type`, `sort`, `ext_obj`, `date_created`, `date_updated`) VALUES
('119', '6', 'gray', 'gray', '3', '1', '9',
'{"required":"0","defaultValue":"false","placeholder":"gray","rule":""}',
'2021-03-06 21:29:16', '2021-09-23 14:45:16');
diff --git a/shenyu-admin/src/main/resources/sql-script/mysql/schema.sql
b/shenyu-admin/src/main/resources/sql-script/mysql/schema.sql
index 7ce5da7..6467605 100644
--- a/shenyu-admin/src/main/resources/sql-script/mysql/schema.sql
+++ b/shenyu-admin/src/main/resources/sql-script/mysql/schema.sql
@@ -345,7 +345,7 @@ INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`,
`config`, `enabled`,
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `config`,
`enabled`, `date_created`, `date_updated`) VALUES ('23', 'modifyResponse',
'http process', 220, '{"ruleHandlePageType":"custom"}', '0', '2021-05-30
21:26:37', '2021-05-30 23:26:11');
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('24', 'cryptor_request', 'cryptor',
100, '1', '2021-08-06 13:55:21', '2021-08-17 16:35:41');
INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('25', 'cryptor_response', 'cryptor',
410, '1', '2021-08-06 13:55:30', '2021-08-13 16:03:40');
-INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `enabled`,
`date_created`, `date_updated`) VALUES ('26', 'websocket', 'proxy', 200, '1',
'2021-08-27 13:55:30', '2021-08-27 16:03:40');
+INSERT IGNORE INTO `plugin` (`id`, `name`, `role`, `sort`, `config`,
`enabled`, `date_created`, `date_updated`) VALUES ('26', 'websocket', 'proxy',
200, '{"multiSelectorHandle":"1"}', '1', '2021-08-27 13:55:30', '2021-08-27
16:03:40');
/*insert plugin_handle data for sentinel*/
INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1','10' ,'flowRuleGrade','flowRuleGrade','3', 2, 8,
'{"required":"1","defaultValue":"1","rule":""}', '2020-11-09 01:19:10',
'2020-11-09 01:19:10');
@@ -490,16 +490,17 @@ INSERT IGNORE INTO plugin_handle (`id`, `plugin_id`,
`field`, `label`, `data_typ
INSERT IGNORE INTO plugin_handle (`id`, `plugin_id`, `field`, `label`,
`data_type`, `type`, `sort`, `ext_obj`, `date_created`, `date_updated`) VALUES
('118', '6', 'weight', 'weight', '1', '1', '5',
'{"defaultValue":"50","rule":""}', '2021-03-06 21:26:35', '2021-09-23
14:45:03');
/*insert plugin_handle data for websocket*/
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1000', '26', 'host', 'host', 2, 1, 0, null, '2021-08-27 21:23:41',
'2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1001', '26', 'protocol', 'protocol', 2, 1, 2,
'{"required":"0","defaultValue":"","placeholder":"ws://","rule":""}',
'2021-08-27 21:25:37', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1002', '26', 'url', 'ip:port', 2, 1, 1,
'{"required":"1","placeholder":"","rule":""}', '2021-08-27 21:25:55',
'2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1003', '26', 'weight', 'weight', 1, 1, 3,
'{"defaultValue":"50","rule":""}', '2021-08-27 21:26:35', '2021-08-27
10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1004', '26', 'timestamp', 'startupTime', 1, 1, 3,
'{"defaultValue":"0","placeholder":"startup timestamp","rule":""}', '2021-08-27
21:27:11', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1005', '26', 'warmup', 'warmupTime', 1, 1, 5,
'{"defaultValue":"0","placeholder":"warmup time (ms)","rule":""}', '2021-08-27
21:27:34', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1006', '26', 'status', 'status', 3, 1, 6,
'{"defaultValue":"true","rule":""}', '2021-08-27 21:29:16', '2021-08-27
10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1007', '26', 'loadBalance', 'loadStrategy', 3, 2, 0, null,
'2021-08-27 21:30:32', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1008', '26', 'retry', 'retryCount', 1, 2, 1, null, '2021-08-27
21:31:00', '2021-08-27 10:32:51');
-INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('1009', '26', 'timeout', 'timeout', 1, 2, 2,
'{"defaultValue":"3000","rule":""}', '2021-08-27 21:13:50', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2000', '26', 'host', 'host', 2, 1, 0, null, '2021-08-27 21:23:41',
'2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2001', '26', 'protocol', 'protocol', 2, 1, 2,
'{"required":"0","defaultValue":"","placeholder":"ws://","rule":""}',
'2021-08-27 21:25:37', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2002', '26', 'url', 'ip:port', 2, 1, 1,
'{"required":"1","placeholder":"","rule":""}', '2021-08-27 21:25:55',
'2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2003', '26', 'weight', 'weight', 1, 1, 3,
'{"defaultValue":"50","rule":""}', '2021-08-27 21:26:35', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2004', '26', 'timestamp', 'startupTime', 1, 1, 3,
'{"defaultValue":"0","placeholder":"startup timestamp","rule":""}', '2021-08-27
21:27:11', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2005', '26', 'warmup', 'warmupTime', 1, 1, 5,
'{"defaultValue":"0","placeholder":"warmup time (ms)","rule":""}', '2021-08-27
21:27:34', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2006', '26', 'status', 'status', 3, 1, 6,
'{"defaultValue":"true","rule":""}', '2021-08-27 21:29:16', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2007', '26', 'loadBalance', 'loadStrategy', 3, 2, 0, null,
'2021-08-27 21:30:32', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2008', '26', 'retry', 'retryCount', 1, 2, 1, null, '2021-08-27
21:31:00', '2021-08-27 10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2009', '26', 'timeout', 'timeout', 1, 2, 2,
'{"defaultValue":"3000","rule":""}', '2021-08-27 21:13:50', '2021-08-27
10:32:51');
+INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('2010', '26', 'multiSelectorHandle', 'multiSelectorHandle', 3, 3, 0,
null, '2021-08-27 21:30:32', '2021-08-27 10:32:51');
/*insert plugin_handle data for plugin motan*/
INSERT IGNORE INTO plugin_handle
(`id`,`plugin_id`,`field`,`label`,`data_type`,`type`,`sort`,`ext_obj`,`date_created`,`date_updated`)
VALUES ('150', '17', 'register', 'register', 2, 3, 0, null, '2021-09-25
13:19:10', '2021-09-25 13:19:10');
diff --git a/shenyu-bootstrap/pom.xml b/shenyu-bootstrap/pom.xml
index f8c1788..25f2e18 100644
--- a/shenyu-bootstrap/pom.xml
+++ b/shenyu-bootstrap/pom.xml
@@ -307,7 +307,15 @@
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
- <!-- shenyu alibaba dubbo plugin end-->
+ <!--shenyu alibaba dubbo plugin end-->
+
+ <!--shenyu websocket plugin start-->
+ <dependency>
+ <groupId>org.apache.shenyu</groupId>
+
<artifactId>shenyu-spring-boot-starter-plugin-websocket</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <!--shenyu websocket plugin end-->
<!--shenyu data sync start use zookeeper-->
<dependency>