This commit is contained in:
rewerma
2019-07-13 18:03:28 +08:00
parent 40d2a8c6cc
commit 4efc0f6078
8 changed files with 215 additions and 31 deletions

View File

@@ -16,30 +16,30 @@ public class CanalInstanceController {
@Autowired
CanalInstanceService canalInstanceConfigService;
@GetMapping(value = "/canalInstances")
@GetMapping(value = "/instances")
public BaseModel<List<CanalInstanceConfig>> nodeServers(CanalInstanceConfig canalInstanceConfig,
@PathVariable String env) {
return BaseModel.getInstance(canalInstanceConfigService.findList(canalInstanceConfig));
}
@PostMapping(value = "/canalInstance")
@PostMapping(value = "/iInstance")
public BaseModel<String> save(@RequestBody CanalInstanceConfig canalInstanceConfig, @PathVariable String env) {
canalInstanceConfigService.save(canalInstanceConfig);
return BaseModel.getInstance("success");
}
@GetMapping(value = "/canalInstance/{id}")
@GetMapping(value = "/instance/{id}")
public BaseModel<CanalInstanceConfig> detail(@PathVariable Long id, @PathVariable String env) {
return BaseModel.getInstance(canalInstanceConfigService.detail(id));
}
@PutMapping(value = "/canalInstance")
@PutMapping(value = "/instance")
public BaseModel<String> update(@RequestBody CanalInstanceConfig canalInstanceConfig, @PathVariable String env) {
canalInstanceConfigService.updateContent(canalInstanceConfig);
return BaseModel.getInstance("success");
}
@DeleteMapping(value = "/nodeServer/{id}")
@DeleteMapping(value = "/instance/{id}")
public BaseModel<String> delete(@PathVariable Long id, @PathVariable String env) {
canalInstanceConfigService.delete(id);
return BaseModel.getInstance("success");

View File

@@ -34,7 +34,7 @@ public class JMXConnection {
CanalServerMXBean canalServerMXBean = jmxConnection.getCanalServerMXBean();
return function.apply(canalServerMXBean);
} catch (Exception e) {
logger.error(e.getMessage(), e);
logger.error(e.getMessage());
} finally {
jmxConnection.close();
}

View File

@@ -24,15 +24,13 @@ public class CanalInstanceConfig extends Model {
}
@Id
private Long id;
private String name;
private String content;
private Date modifiedTime;
private Long id;
private String name;
private String content;
private Date modifiedTime;
@Transient
private NodeServer nodeServer;
@Transient
private Integer status = 0;
private String nodeIp;
public Long getId() {
return id;
@@ -66,19 +64,11 @@ public class CanalInstanceConfig extends Model {
this.modifiedTime = modifiedTime;
}
public NodeServer getNodeServer() {
return nodeServer;
public String getNodeIp() {
return nodeIp;
}
public void setNodeServer(NodeServer nodeServer) {
this.nodeServer = nodeServer;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
public void setNodeIp(String nodeIp) {
this.nodeIp = nodeIp;
}
}

View File

@@ -2,16 +2,16 @@ package com.alibaba.otter.canal.admin.service.impl;
import java.util.List;
import com.alibaba.otter.canal.admin.service.CanalInstanceService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import com.alibaba.otter.canal.admin.jmx.CanalServerMXBean;
import com.alibaba.otter.canal.admin.jmx.JMXConnection;
import com.alibaba.otter.canal.admin.model.CanalInstanceConfig;
import com.alibaba.otter.canal.admin.model.NodeServer;
import com.alibaba.otter.canal.admin.service.CanalInstanceService;
import io.ebean.Query;
import org.springframework.stereotype.Service;
@Service
public class CanalInstanceServiceImpl implements CanalInstanceService {
@@ -25,6 +25,7 @@ public class CanalInstanceServiceImpl implements CanalInstanceService {
query.where().like("name", "%" + canalInstanceConfig.getName() + "%");
}
}
query.order().asc("id");
List<CanalInstanceConfig> canalInstanceConfigs = query.findList();
// check all canal instances running status
@@ -39,8 +40,7 @@ public class CanalInstanceServiceImpl implements CanalInstanceService {
for (String instance : instances) {
for (CanalInstanceConfig cig : canalInstanceConfigs) {
if (instance.equals(cig.getName())) {
cig.setNodeServer(nodeServer);
cig.setStatus(1);
cig.setNodeIp(nodeServer.getIp());
break;
}
}

View File

@@ -0,0 +1,24 @@
import request from '@/utils/request'
export function getCanalInstances(params) {
return request({
url: '/canal/instances',
method: 'get',
params: params
})
}
export function canalInstanceDetail(id) {
return request({
url: '/canal/instance/' + id,
method: 'get'
})
}
export function updateCanalInstance(data) {
return request({
url: '/canal/instance',
method: 'put',
data
})
}

View File

@@ -75,9 +75,9 @@ export const constantRoutes = [
meta: { title: 'Canal主配置', icon: 'form' }
},
{
path: 'tree',
path: 'canalInstance',
name: '实例管理',
component: () => import('@/views/tree/index'),
component: () => import('@/views/canalServer/canalInstance'),
meta: { title: '实例管理', icon: 'nested' }
}
]

View File

@@ -0,0 +1,78 @@
<template>
<div class="app-container">
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column label="实例名称" min-width="200" align="center">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="运行节点" min-width="200" align="center">
<template slot-scope="scope">
<span>{{ scope.row.nodeIp }}</span>
</template>
</el-table-column>
<el-table-column label="修改时间" min-width="200" align="center">
<template slot-scope="scope">
{{ scope.row.modifiedTime }}
</template>
</el-table-column>
<el-table-column align="center" prop="created_at" label="操作" min-width="150">
<template slot-scope="scope">
<el-dropdown trigger="click">
<el-button type="primary" size="mini">
操作<i class="el-icon-arrow-down el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="handleUpdate(scope.row)">修改节点</el-dropdown-item>
<el-dropdown-item @click.native="handleDelete(scope.row)">删除节点</el-dropdown-item>
<el-dropdown-item @click.native="handleStart(scope.row)">启动服务</el-dropdown-item>
<el-dropdown-item @click.native="handleStop(scope.row)">停止服务</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getCanalInstances } from '@/api/canalInstance'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
getCanalInstances().then(res => {
this.list = res.data
this.listLoading = false
})
}
}
}
</script>

View File

@@ -0,0 +1,92 @@
<template>
<div>
<el-form ref="form" :model="form">
<div style="padding-left: 10px;padding-top: 20px;">
<el-form-item>
{{ form.name }}&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="onSubmit">修改</el-button>
<el-button @click="onCancel">重置</el-button>
</el-form-item>
</div>
<editor v-model="form.content" lang="properties" theme="chrome" width="100%" :height="800" @init="editorInit" />
</el-form>
</div>
</template>
<script>
import { getCanalConfig, updateCanalConfig } from '@/api/canalConfig'
export default {
components: {
editor: require('vue2-ace-editor')
},
data() {
return {
form: {
id: null,
name: '',
content: ''
}
}
},
created() {
this.loadCanalConfig()
},
methods: {
editorInit() {
require('brace/ext/language_tools')
require('brace/mode/html')
require('brace/mode/yaml')
require('brace/mode/properties')
require('brace/mode/javascript')
require('brace/mode/less')
require('brace/theme/chrome')
require('brace/snippets/javascript')
},
loadCanalConfig() {
getCanalConfig().then(response => {
const data = response.data
this.form.id = data.id
this.form.name = data.name
this.form.content = data.content
})
},
onSubmit() {
this.$confirm(
'修改Canal主配置可能会导致Server重启,是否继续?',
'确定修改',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
updateCanalConfig(this.form).then(response => {
if (response.data === 'success') {
this.$message({
message: '修改成功',
type: 'success'
})
this.loadCanalConfig()
} else {
this.$message({
message: '修改失败',
type: 'error'
})
}
})
})
},
onCancel() {
this.loadCanalConfig()
}
}
}
</script>
<style scoped>
.line{
text-align: center;
}
</style>