我实现了一个消费者,如果底层连接关闭,它会在一段时间后自动重新连接到代理.我的情况如下:
停止RabbitMQ服务器,消费者将显示异常:
com.rabbitmq.client.ShutdownSignalException:连接错误; 原因:{#method(reply-code = 541,reply-text = INTERNAL_ERROR,class-id = 0,method-id = 0),null,""}.
然后消费者将在重新连接前睡60秒.
在这种情况下,重新连接之前发布的所有消息都将丢失.我还做了另一个实验.
注意:消费者的QOS是1.我已经研究过RabbitMQ几天了,根据我的理解,消费者应该在重新连接之前发布消息.请帮忙(我根据windows rabbitMQ运行测试).
以下是PUBLISHER:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(this.getHost());
connection = factory.newConnection();
Channel channel = connection.createChannel();
channel = conn.createChannel();
// declare a 'topic' type of exchange
channel.exchangeDeclare(exchangeName, "topic");
// Content-type "application/octet-stream", deliveryMode 2
// (persistent), priority zero
channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_BASIC, message);
connection.close();
Run Code Online (Sandbox Code Playgroud)
消费者如下:
@Override
public void consume(final String exchangeName, final String queueName, final String routingKey,
final …Run Code Online (Sandbox Code Playgroud) 我的情况是rabbitmq服务器空间不足,如下所示
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/ramonubuntu--vg-root 6299376 5956336 0 100% /
Run Code Online (Sandbox Code Playgroud)
生产者向服务器发布消息(消息需要持久化),然后将永久阻止,它将等待发布的响应.当然我们应该避免服务器空间不足的情况,但有没有任何超时机制让生产者退出等待?
我尝试过心跳和SO_TIMEOUT,它们都不起作用,因为网络工作正常.以下是我的制片人.
protected void publish(byte[] message) throws Exception {
// ConnectionFactory can be reused between threads.
ConnectionFactory factory = new SoTimeoutConnectionFactory();
factory.setHost(this.getHost());
factory.setVirtualHost("te");
factory.setPort(5672);
factory.setUsername("amqp");
factory.setPassword("amqp");
factory.setConnectionTimeout(10 * 1000);
// doesn't help if server got out of space
factory.setRequestedHeartbeat(1);
final Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// declare a 'topic' type of exchange
channel.exchangeDeclare(this.exchangeName, "topic", true);
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, …Run Code Online (Sandbox Code Playgroud) 很多人说通过创建只读和只写数据库可以实现更高的性能,坦白说,我无法完全理解它.有些人告诉我写作需要很多不同的锁,这会减慢阅读速度......但正如我的理解,系统中的许多阅读都不需要锁定,例如oracle一致性读取,锁定如何影响阅读?除了我想要分片数据库,读/写分离提供更多价值吗?
您能否详细解释或提供一些外部资源,说明为什么读/写分离可以提供更高的性能,谢谢.