package org.demo.scheduletest.service;
import com.rabbitmq.client.Channel;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Data
@Slf4j
public class DataSyncTask implements Runnable {
private String name;
private Channel channel;
private long deliveryTag;
public DataSyncTask(String name, Channel channel, long deliveryTag) {
this.name = name;
this.channel = channel;
this.deliveryTag = deliveryTag;
}
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see Thread#run()
*/
@Override
public void run() {
log.info("[DataSyncTask] run task start, name = {}", name);
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
channel.basicAck(deliveryTag, true);
log.info("[DataSyncTask] run task end, name = {}", name);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
InitTask,服务启动执行Task管理器
复制代码
package org.demo.scheduletest.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @author zhe.xiao
* @version 1.0
* @since 2025/1/9 上午11:38
*/
@Slf4j
@Component
public class InitTask implements ApplicationRunner {
/**
* Callback used to run the bean.
*
* @param args incoming application arguments
* @throws Exception on error
*/
@Override
public void run(ApplicationArguments args) throws Exception {
DataSyncTaskManager.getManager().runTaskDaemon();
}
}
配置Rabbitmq
复制代码
package org.demo.scheduletest.rabbitmq;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
/**
* @author zhe.xiao
* @date 2022-07-06 17:27
* @description
**/
@SpringBootConfiguration
public class MyRabbitTemplateConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtual-host:/}")
private String virtualhost;
/**
* 连接工厂
* @return
*/
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
//connectionFactory.setPublisherConfirms(true);
return connectionFactory;
}
/**
*
* @return RabbitTemplate
*/
@Bean
public RabbitTemplate rabbitTemplate() {
return new RabbitTemplate(connectionFactory());
}
}
package org.demo.scheduletest.rabbitmq;
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;
import java.util.HashMap;
/**
* @author zhe.xiao
* @date 2022-07-05 14:55
* @description
**/
@Configuration
public class MyRabbitExecutor {
//正常队列
public static final String QUEUE_1 = "my:queue:1";
public static final String EXCHANGE_1 = "my:exchange:1";
public static final String ROUTEING_1 = "data:route:1";
//死信队列
public static final String QUEUE_DEAD_LETTER = "my:queue:deadLetter";
public static final String EXCHANGE_DEAD_LETTER = "my:exchange:deadLetter";
public static final String ROUTING_DEAD_LETTER = "data:route:deadLetter";
// 提供 Queue
@Bean
Queue myQueue1(){
HashMap<String, Object> args = new HashMap<>();
//绑定死信队列信息
args.put("x-dead-letter-exchange", EXCHANGE_DEAD_LETTER);
args.put("x-dead-letter-routing-key", ROUTING_DEAD_LETTER);
// args.put("x-max-length", 5); //队列最大长度,超过了会进入死信队列
// args.put("x-message-ttl", 5000); //如果5秒没被消费,则进入死信队列
return new Queue(QUEUE_1, true, false, false, args);
}
// 提供 Exchange
@Bean
DirectExchange myExchange1(){
return new DirectExchange(EXCHANGE_1, true, false);
}
// 创建一个Binding对象,将Exchange和Queue绑定在一起
@Bean
Binding myBinding1(){
return BindingBuilder.bind(myQueue1()).to(myExchange1()).with(ROUTEING_1);
// return BindingBuilder.bind(myQueue1()).to(myExchange1());
}
// 死信队列配置 QUEUE, EXCHANGE, BINDING
@Bean
Queue myQueueDeadLetter(){
return new Queue(QUEUE_DEAD_LETTER, true, false, false);
}
@Bean
DirectExchange myExchangeDeadLetter(){
return new DirectExchange(EXCHANGE_DEAD_LETTER, true, false);
}
@Bean
Binding myBindingDeadLetter(){
return BindingBuilder.bind(myQueueDeadLetter()).to(myExchangeDeadLetter()).with(ROUTING_DEAD_LETTER);
}
}