@@ -263,7 +263,10 @@ | |||||
<scope>system</scope> | <scope>system</scope> | ||||
<systemPath>${basedir}/src/lib/zwdd-sdk-java-1.2.0.jar</systemPath> | <systemPath>${basedir}/src/lib/zwdd-sdk-java-1.2.0.jar</systemPath> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-rabbitmq-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>org.apache.httpcomponents</groupId> | <groupId>org.apache.httpcomponents</groupId> | ||||
<artifactId>httpclient</artifactId> | <artifactId>httpclient</artifactId> | ||||
@@ -272,13 +275,11 @@ | |||||
<dependency> | <dependency> | ||||
<groupId>joda-time</groupId> | <groupId>joda-time</groupId> | ||||
<artifactId>joda-time</artifactId> | <artifactId>joda-time</artifactId> | ||||
<version>2.10.6</version> | |||||
</dependency> | </dependency> | ||||
<!--状态机--> | <!--状态机--> | ||||
<dependency> | <dependency> | ||||
<groupId>org.springframework.statemachine</groupId> | <groupId>org.springframework.statemachine</groupId> | ||||
<artifactId>spring-statemachine-core</artifactId> | <artifactId>spring-statemachine-core</artifactId> | ||||
<version>2.0.1.RELEASE</version> | |||||
</dependency> | </dependency> | ||||
</dependencies> | </dependencies> | ||||
@@ -0,0 +1,64 @@ | |||||
package com.ningdatech.pmapi.rabbitmq.config; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.amqp.core.Binding; | |||||
import org.springframework.amqp.core.BindingBuilder; | |||||
import org.springframework.amqp.core.DirectExchange; | |||||
import org.springframework.amqp.core.Queue; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
/** | |||||
* @author zpf | |||||
* @version 1.0.0 | |||||
* @Description 创建direct类型的交换机 | |||||
* @createTime 2023年02月17日 | |||||
*/ | |||||
@Slf4j | |||||
@Configuration | |||||
public class DirectRabbitConfig { | |||||
private static final String QUEUE = "TestDirectQueue"; | |||||
private static final String EXCHANGE = "TestDirectExchange"; | |||||
private static final String ROUTING_KEY = "TestDirectRouting"; | |||||
/** | |||||
* 创建一个名为TestDirectQueue的队列 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Bean | |||||
public Queue testDirectQueue() { | |||||
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效 | |||||
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable | |||||
// autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。 | |||||
// arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。 | |||||
return new Queue(QUEUE, true); | |||||
} | |||||
/** | |||||
* 创建一个名为TestDirectExchange的Direct类型的交换机 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Bean | |||||
public DirectExchange testDirectExchange() { | |||||
// durable:是否持久化,默认是false,持久化交换机。 | |||||
// autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。 | |||||
// arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机 | |||||
return new DirectExchange(EXCHANGE, true, false); | |||||
} | |||||
/** | |||||
* 绑定交换机和队列 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Bean | |||||
public Binding bindingDirect() { | |||||
//bind队列to交换机中with路由key(routing key) | |||||
return BindingBuilder.bind(testDirectQueue()).to(testDirectExchange()).with(ROUTING_KEY); | |||||
} | |||||
} | |||||
@@ -0,0 +1,47 @@ | |||||
package com.ningdatech.pmapi.rabbitmq.config; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.amqp.core.ReturnedMessage; | |||||
import org.springframework.amqp.rabbit.connection.ConnectionFactory; | |||||
import org.springframework.amqp.rabbit.connection.CorrelationData; | |||||
import org.springframework.amqp.rabbit.core.RabbitTemplate; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
@Slf4j | |||||
@Configuration | |||||
public class RabbitConfig { | |||||
@Bean | |||||
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) { | |||||
RabbitTemplate rabbitTemplate = new RabbitTemplate(); | |||||
rabbitTemplate.setConnectionFactory(connectionFactory); | |||||
//设置消息投递失败的策略,有两种策略:自动删除或返回到客户端。 | |||||
//我们既然要做可靠性,当然是设置为返回到客户端(true是返回客户端,false是自动删除) | |||||
rabbitTemplate.setMandatory(true); | |||||
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { | |||||
@Override | |||||
public void confirm(CorrelationData correlationData, boolean ack, String cause) { | |||||
if (ack) { | |||||
log.info("ConfirmCallback 关联数据:{},投递成功,确认情况:{}", correlationData, ack); | |||||
} else { | |||||
log.info("ConfirmCallback 关联数据:{},投递失败,确认情况:{},原因:{}", correlationData, ack, cause); | |||||
} | |||||
} | |||||
}); | |||||
rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() { | |||||
@Override | |||||
public void returnedMessage(ReturnedMessage returnedMessage) { | |||||
log.info("ReturnsCallback 消息:{},回应码:{},回应信息:{},交换机:{},路由键:{}" | |||||
, returnedMessage.getMessage(), returnedMessage.getReplyCode() | |||||
, returnedMessage.getReplyText(), returnedMessage.getExchange() | |||||
, returnedMessage.getRoutingKey()); | |||||
} | |||||
}); | |||||
return rabbitTemplate; | |||||
} | |||||
} |
@@ -0,0 +1,59 @@ | |||||
package com.ningdatech.pmapi.rabbitmq.controller; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.ningdatech.pmapi.user.entity.UserInfo; | |||||
import org.springframework.amqp.rabbit.connection.CorrelationData; | |||||
import org.springframework.amqp.rabbit.core.RabbitTemplate; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.web.bind.annotation.GetMapping; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import java.util.UUID; | |||||
/** | |||||
* @author zpf | |||||
* @version 1.0.0 | |||||
* @Description | |||||
* @createTime 2023年02月17日 | |||||
*/ | |||||
@RestController | |||||
public class TestController { | |||||
@Autowired | |||||
RabbitTemplate rabbitTemplate; | |||||
@GetMapping("/test") | |||||
public String test() { | |||||
return "producer ok"; | |||||
} | |||||
@GetMapping("/push") | |||||
public String push() { | |||||
for (int i = 1; i <= 5; i++) { | |||||
//这个参数是用来做消息的唯一标识 | |||||
//发布消息时使用,存储在消息的headers中 | |||||
UserInfo user = new UserInfo(); | |||||
user.setId(1L); | |||||
user.setRealName("汪涵"); | |||||
// 关联的数据,可以用在消息投递失败的时候,作为一个线索,比如我把当前用户的id放进去,如果user消息投递失败 | |||||
// 我后面可以根据id再找到user,再次投递数据 | |||||
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString().concat("-") + i); | |||||
if (i == 2) { | |||||
//故意把交换机写错,演示 confirmCallback | |||||
rabbitTemplate.convertAndSend("TestDirectExchange_111", "TestDirectRouting", | |||||
JSON.toJSONString(user), correlationData); | |||||
} else if (i == 3) { | |||||
//故意把路由键写错,演示 returnCallback | |||||
rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting_111", | |||||
JSON.toJSONString(user), correlationData); | |||||
} else { | |||||
//正常发送 | |||||
rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", | |||||
JSON.toJSONString(user), correlationData); | |||||
} | |||||
} | |||||
return "producer push ok"; | |||||
} | |||||
} | |||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill; | |||||
import com.baomidou.mybatisplus.annotation.TableField; | import com.baomidou.mybatisplus.annotation.TableField; | ||||
import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||
import com.ningdatech.pmapi.common.model.entity.MenuTreeEntity; | import com.ningdatech.pmapi.common.model.entity.MenuTreeEntity; | ||||
import com.ningdatech.pmapi.sys.model.enumeration.DataScopeEnum; | |||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.*; | import lombok.*; | ||||
@@ -60,6 +61,9 @@ public class Menu extends MenuTreeEntity<Menu, Long> { | |||||
@ApiModelProperty("是否有数据权限") | @ApiModelProperty("是否有数据权限") | ||||
private Boolean hasDataScope; | private Boolean hasDataScope; | ||||
/** | |||||
* @see DataScopeEnum | |||||
*/ | |||||
@ApiModelProperty("数据权限选项") | @ApiModelProperty("数据权限选项") | ||||
private String dataScopeOption; | private String dataScopeOption; | ||||
@@ -87,6 +87,18 @@ spring: | |||||
wall: | wall: | ||||
config: | config: | ||||
multi-statement-allow: true | multi-statement-allow: true | ||||
# rabbitmq 配置信息 | |||||
rabbitmq: | |||||
host: 110.40.194.60 | |||||
port: 5672 | |||||
username: admin | |||||
password: admin | |||||
#1、确保消息从发送端到服务端投递可靠(分为以下两个步骤) | |||||
#1.1、确认消息已发送到交换机(Exchange) 可以把publisher-confirms: true 替换为 publisher-confirm-type: correlate | |||||
publisher-confirm-type: correlated | |||||
#1.2、确认消息从交换机中到队列中 | |||||
publisher-returns: true | |||||
mybatis-plus: | mybatis-plus: | ||||
configuration: | configuration: | ||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | ||||
@@ -149,6 +149,22 @@ | |||||
<artifactId>nd-log-starter</artifactId> | <artifactId>nd-log-starter</artifactId> | ||||
<version>1.0.0</version> | <version>1.0.0</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-rabbitmq-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>joda-time</groupId> | |||||
<artifactId>joda-time</artifactId> | |||||
<version>2.10.6</version> | |||||
</dependency> | |||||
<!--状态机--> | |||||
<dependency> | |||||
<groupId>org.springframework.statemachine</groupId> | |||||
<artifactId>spring-statemachine-core</artifactId> | |||||
<version>2.0.1.RELEASE</version> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
</dependencyManagement> | </dependencyManagement> | ||||