标签:
在 RabbitMQ 中,消息的持久性是通过设置消息的 deliveryMode
属性为 2
来实现的。对于非持久化消息,deliveryMode
属性应设置为 1
。
下面是一个示例,演示如何发送非持久化消息并在其中设置可选的消息过期时间:
import com.rabbitmq.client.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class RabbitMQSender {
private static final String QUEUE_NAME = "my_queue";
private static Connection connection;
public static void main(String[] args) throws Exception {
try {
// 创建连接
createConnection();
// 创建通道
Channel channel = connection.createChannel();
// 发送非持久化消息
sendMessage(channel, "Hello RabbitMQ!", false, 5000); // 设置消息过期时间为 5 秒
// 关闭通道
channel.close();
} finally {
// 关闭连接
closeConnection();
}
}
private static void createConnection() throws Exception {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
// 创建连接
connection = factory.newConnection();
}
private static void closeConnection() throws Exception {
if (connection != null && connection.isOpen()) {
connection.close();
}
}
private static void sendMessage(Channel channel, String message, boolean durable, long expiration) throws Exception {
// 声明队列
channel.queueDeclare(QUEUE_NAME, durable, false, false, null);
// 设置消息属性
AMQP.BasicProperties.Builder propertiesBuilder = new AMQP.BasicProperties.Builder();
propertiesBuilder.expiration(String.valueOf(expiration)); // 设置消息过期时间
propertiesBuilder.deliveryMode(durable ? 2 : 1); // 设置消息持久性
// 发送消息
channel.basicPublish("", QUEUE_NAME, propertiesBuilder.build(), message.getBytes(StandardCharsets.UTF_8));
System.out.println("Sent: " + message);
}
}
Java
在上述示例中,我们定义了一个 sendMessage
方法,该方法允许我们设置消息是否为持久化消息以及消息的过期时间。durable
参数用于确定消息是否为持久化消息,并且 expiration
参数指定了消息的过期时间(以毫秒为单位)。
当 durable
参数为 false
时,deliveryMode
属性被设置为 1
,表示非持久化消息。可以通过修改 durable
参数来发送持久化或非持久化消息,并通过修改 expiration
参数来设置消息的过期时间。
请注意,消息过期时间是通过 RabbitMQ 的 TTL(Time to Live)机制实现的,RabbitMQ 会自动删除到期的消息。因此,过期时间的精确度可能会受到 RabbitMQ 的配置和性能限制的影响。
标签: 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。