提交 f490012a 作者: 方治民

feat: 新增 Jts Jackson 序列化/反序列化配置、增加动态注入真源 RabbitMQ 消息监听和配置等

上级 2628e699
......@@ -3,17 +3,19 @@ package com.yiring.app.push.domain;
import com.alibaba.fastjson.JSON;
import com.vladmihalcea.hibernate.type.json.JsonType;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.snowflake.SnowflakeId;
/**
* 推送消息日志
......@@ -26,7 +28,7 @@ import org.hibernate.snowflake.SnowflakeId;
@Getter
@Setter
@ToString
@Builder
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
......@@ -42,22 +44,15 @@ import org.hibernate.snowflake.SnowflakeId;
@Index(columnList = "sourceId"),
@Index(columnList = "target"),
@Index(columnList = "targetId"),
@Index(columnList = "createTime"),
@Index(columnList = "pushTime"),
@Index(columnList = "updateTime"),
}
)
@Comment("推送消息日志")
public class PushMessage implements Serializable {
public class PushMessage extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1478640364892356248L;
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("消息类型")
@Enumerated(EnumType.STRING)
Type type;
......@@ -87,8 +82,9 @@ public class PushMessage implements Serializable {
Status status;
@Comment("推送反馈结果")
@Column(columnDefinition = "TEXT")
String result;
@org.hibernate.annotations.Type(type = "json")
@Column(columnDefinition = "json")
JSON result;
@Comment("重试次数")
Integer retryCount;
......@@ -96,12 +92,6 @@ public class PushMessage implements Serializable {
@Comment("推送时间")
LocalDateTime pushTime;
@Comment("更新时间")
LocalDateTime updateTime;
@Comment("创建时间")
LocalDateTime createTime;
@SuppressWarnings({ "unused" })
public enum Type {
WS("STOMP WebSocket 消息"),
......@@ -142,4 +132,17 @@ public class PushMessage implements Serializable {
return this.text;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
PushMessage that = (PushMessage) o;
return getId() != null && Objects.equals(getId(), that.getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
}
}
......@@ -12,13 +12,13 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq配置
* 推送 rabbitmq 配置
*
* @author ifzm
* 2019/8/21 15:44
*/
@Configuration("PushRabbitConfig")
public class RabbitConfig {
@Configuration
public class PushRabbitConfig {
public static final String PUSH_TOPIC_EXCHANGE = "push.topic.exchange";
......
......@@ -20,13 +20,13 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Component("PushRabbitReceiver")
@Transactional(rollbackFor = Exception.class)
public class RabbitReceiver {
public class PushRabbitReceiver {
@Resource
PushMessageRepository repository;
@RabbitHandler
@RabbitListener(queues = RabbitConfig.PUSH_WS_QUEUE)
@RabbitListener(queues = PushRabbitConfig.PUSH_WS_QUEUE)
public void receiverWebSocketMessage(Long id) {
log.info("接收到消息: " + id);
......
......@@ -4,6 +4,7 @@ package com.yiring.app.push.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.yiring.app.push.domain.PushMessage;
import com.yiring.app.push.domain.PushMessageRepository;
import com.yiring.app.push.rabbitmq.PushRabbitConfig;
import com.yiring.app.push.service.PushService;
import java.time.LocalDateTime;
import javax.annotation.Resource;
......@@ -38,6 +39,6 @@ public class PushServiceImpl implements PushService {
message.setExtra(raw);
message.setCreateTime(LocalDateTime.now());
repository.saveAndFlush(message);
amqpTemplate.convertAndSend(type.queue(), message.getId());
amqpTemplate.convertAndSend(PushRabbitConfig.PUSH_TOPIC_EXCHANGE, type.queue(), message.getId());
}
}
......@@ -46,18 +46,17 @@ dependencies {
// fastjson
implementation "com.alibaba:fastjson:${fastJsonVersion}"
// hutool-core
// hutool
implementation "cn.hutool:hutool-core:${hutoolVersion}"
implementation "cn.hutool:hutool-extra:${hutoolVersion}"
// JPA 增加空间字段支持
// https://blog.wuwii.com/jpa-spatial.html
implementation("org.hibernate:hibernate-spatial:${hibernateSpatialVersion}") {
exclude group: 'org.postgresql', module: 'postgresql'
}
// JTS 几何对象操作库
implementation "org.locationtech.jts:jts-core:${jtsVersion}"
// https://mvnrepository.com/artifact/com.graphhopper.external/jackson-datatype-jts
implementation 'com.graphhopper.external:jackson-datatype-jts:1.0-2.7'
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.config;
import com.bedatadriven.jackson.datatype.jts.JtsModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Jim
* @version 0.1
* 2022/4/8 11:18
*/
@Configuration
public class JtsModuleConfig {
@Bean
public JtsModule jtsModule() {
return new JtsModule();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.config.dialect;
import java.io.Serial;
import org.hibernate.spatial.dialect.postgis.PostgisPG10Dialect;
/**
......@@ -15,6 +16,7 @@ import org.hibernate.spatial.dialect.postgis.PostgisPG10Dialect;
@SuppressWarnings({ "unused" })
public class PostgresDialect extends PostgisPG10Dialect {
@Serial
private static final long serialVersionUID = 187383913873678550L;
public PostgresDialect() {
......
......@@ -36,6 +36,7 @@ public class ZyConfigProperties {
@ConfigurationProperties(prefix = "zy-config.rabbitmq")
public static class ZyConfigRabbitmq {
boolean enabled;
String host;
int port;
String username;
......
......@@ -6,9 +6,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -23,6 +23,7 @@ import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true")
public class ZyRabbitConfig {
@Resource
......@@ -31,7 +32,6 @@ public class ZyRabbitConfig {
@Resource
ConfigurableApplicationContext context;
public static final String TEMPLATE_NAME = "zyRabbitTemplate";
public static final String CONNECTION_FACTORY_NAME = "zyRabbitConnectionFactory";
public static final String LISTENER_FACTORY_NAME = "zyRabbitListenerFactory";
......@@ -42,7 +42,7 @@ public class ZyRabbitConfig {
*/
public static final String MESSAGE_QUEUES_NAME = "tenant_msg_12A14FDC_sc21080400";
@Bean(name = CONNECTION_FACTORY_NAME)
@Bean(CONNECTION_FACTORY_NAME)
public CachingConnectionFactory zyConnectionFactory() {
return connectionFactory(
rabbitmq.getHost(),
......@@ -53,14 +53,7 @@ public class ZyRabbitConfig {
);
}
@Bean(name = TEMPLATE_NAME)
public RabbitTemplate secondRabbitTemplate(
@Qualifier(CONNECTION_FACTORY_NAME) CachingConnectionFactory connectionFactory
) {
return new RabbitTemplate(connectionFactory);
}
@Bean(name = LISTENER_FACTORY_NAME)
@Bean(LISTENER_FACTORY_NAME)
public SimpleRabbitListenerContainerFactory secondFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier(CONNECTION_FACTORY_NAME) CachingConnectionFactory connectionFactory
......
......@@ -13,6 +13,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
......@@ -26,6 +28,8 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Component
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true")
public class ZyRabbitmqReceiver {
// TODO
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.app.web;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.yiring.app.constant.Code;
import com.yiring.app.exception.CodeException;
import com.yiring.app.push.domain.PushMessage;
import com.yiring.app.push.service.PushService;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
......@@ -46,4 +50,11 @@ public class HelloController {
PageVo<String> vo = PageVo.build(data, data.size());
return Result.ok(vo);
}
@GetMapping("test")
public Result<String> test() {
PushService service = SpringUtil.getBean(PushService.class);
service.push(PushMessage.Type.WS, new JSONObject().fluentPut("msg", "hello"));
return Result.ok();
}
}
......@@ -56,6 +56,7 @@ zy-config:
host: project.yz-online.com
# RabbitMQ 订阅配置
rabbitmq:
enabled: false
host: ${zy-config.host}
port: 672
username: admin
......
......@@ -18,4 +18,13 @@ dependencies {
// fastjson
implementation "com.alibaba:fastjson:${fastJsonVersion}"
// JTS 几何对象操作库
implementation "org.locationtech.jts:jts-core:${jtsVersion}"
// https://mvnrepository.com/artifact/com.graphhopper.external/jackson-datatype-jts
implementation("com.graphhopper.external:jackson-datatype-jts:1.0-2.7") {
exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind'
exclude group: 'org.locationtech.jts', module: 'jts-core'
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import com.bedatadriven.jackson.datatype.jts.JtsModule;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
......@@ -25,8 +26,12 @@ public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 忽略空值
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// Java 8 Date/Time support
mapper.registerModule(javaTimeModule);
// JTS Geometry support
mapper.registerModule(new JtsModule());
// feat: add AdminServerModule
return mapper;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论