不同系统之间实现数据传输,下面列举两种方式,如果大家有其他的方式,欢迎提出来,大家一起研究。
第一种就是使用http传输的方式,第二种就是使用MQ的方式。
使用OkHttp的方式
新建SpringBoot项目,然后编写两个接口,一个用于发送数据,一个用于插入数据到MySQL表中。将该项目打包成jar包,放进云服务器里面(或者修改一下端口,本地启动也是可以的)。
@PostMapping(value = "/insert")
public User insert(@RequestBody User user) {
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
userService.save(user);
return user;
}
@PostMapping(value = "/http")
public User http(@RequestBody User user) {
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
user.setTranceMode("OkHttp");
String param = JSONObject.toJSONString(user);
String url = "http://服务器ip:9090/insert";
OkHttpClient client = new OkHttpClient();
okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(param.getBytes(), MediaType.parse("application/json"));
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
try {
Response response = client.newCall(request).execute();
log.info("响应信息是--->{}", response.message());
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return user;
}
在云服务器里面启动这个项目,显示如下:
然后本地启动这个项目,调用http的接口发送数据:
### okhttp接口
POST http://localhost:9090/http
Content-Type: application/json
{
"name": "路人甲",
"age": 23,
"birthday": "2024-10-23 10:44:49 147",
"tranceMode": "OkHttp"
}
这个时候我们可以查看服务器打印的日志,如下:
然后查看表中的数据,如下:
这样我们就可以看到将数据传输到其他系统上面了。
使用RabbitMQ的方式
private static final String EXCHANGE_NAME = "exchange_demo";
private static final String ROUTING_KEY = "routingkey_demo";
private static final String QUEUE_NAME = "queue_demo";
private static final String IP_ADDRESS = "服务器的ip地址";
private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
private static final String USER_NAME = "admin";
private static final String PASSWORD = "admin";
@PostMapping("/mq-send")
public User mqSend(@RequestBody User user) throws IOException, TimeoutException {
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
Connection connection = factory.newConnection(); //创建连接
Channel channel = connection.createChannel(); //创建信道
//创建一个 type = DIRECT、持久化的、非自动删除的交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
//创建一个持久化、非排他的、非自动删除的队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//将交换器与队列通过路由键绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
//发送一条持久化的信息
String message = JSONObject.toJSONString(user);
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
//关闭资源
channel.close();
connection.close();
return user;
}
@GetMapping("/mq-receive")
public void mqReceive() throws IOException, InterruptedException, TimeoutException {
Address[] addresses = new Address[]{new Address(IP_ADDRESS, PORT)};
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
Connection connection = factory.newConnection(addresses); //创建连接
final Channel channel = connection.createChannel(); //创建信道
channel.basicQos(64); //设置客户端最多接收未被ack的消息的个数
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
log.info("接收信息:{}",new String(body));
User user = JSON.parseObject(body, User.class);
userService.save(user);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, consumer);
//等待回调函数执行完毕之后,关闭资源
TimeUnit.SECONDS.sleep(5);
channel.close();
connection.close();
}
和上述方式一样,一个部署到云服务器中,一个本地启动。然后我们在本地调用发送数据的接口,在服务器调用接收数据的接口,这样就可以实现不同系统之间的数据交换了。(RabbitMQ的安装与启动略,大家可以去参考其他文章或者视频完成下载安装)
### MQ发送数据接口
POST http://localhost:9090/mq-send
Content-Type: application/json
{
"name": "赵六",
"age": 22,
"birthday": "2024-10-21 16:23:49 147",
"tranceMode": "MQ"
}
### 服务器使用MQ接受数据
GET http://服务器ip:9090/mq-receive
我们可以在MQ上面查看到消息的发送与接收的情况。
这个时候我们再看服务器的日志以及MySQL表,就可以发现,数据已经传输过去了。