提交 f490012a 作者: 方治民

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

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