2017-09-05 213 views
0

我已經編寫了一個Spring應用程序,該應用程序正在RabbitMQ Client API中手動實現RabbitMQ。在RabbitMQ中正確處理UnknownHostException,阻止自動恢復

連接工廠和連接的設置方式類似於教程:

public class Recv { 
    private final static String QUEUE_NAME = "hello"; 

    public static void main(String[] argv) 
     throws java.io.IOException, 
      java.lang.InterruptedException { 

    ConnectionFactory factory = new ConnectionFactory(); 
    factory.setHost("122.34.1.1"); 
    factory.setPort(5672); 
    factory.setUsername("user"); 
    factory.setPassword("password") 
    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); 

    channel.queueDeclare(QUEUE_NAME, false, false, false, null); 
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); 
    ... 
    } 
} 

的連接工作正確。但是,如果我關閉了主機服務器,我的應用程序似乎陷入某種循環,試圖通過持續關閉關閉的主機來嘗試自動恢復。

因此,我的控制檯中充滿了大量堆棧軌跡,它們表示「UnknownHostException」。根據蹤跡的確切位置是該行:

Connection connection = factory.newConnection(); 

我試圖把一個try-catch塊圍繞這條線,但是這似乎並沒有在所有的工作。

如果傳統的try-catch塊無法處理來自連接的異常,那麼捕獲異常並停止創建此循環的自動恢復的正確方法是什麼?

謝謝。

回答

0

嘗試建立你的兔子是這樣的(兩端):

@Bean 
    public ConnectionFactory connectionFactory() { 
     final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(server); 
     connectionFactory.setUsername("user"); 
     connectionFactory.setPassword("pass"); 
     return connectionFactory; 
    } 

    @Bean 
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
     final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory()); 
     return factory; 
    } 

端口默認情況下應設置。如果沒有,它會在啓動時顯示,您可以更改它。隊列應由消費者(主持人或任何你稱之爲的)聲明和設置。 如果你還沒有在你的配置類中添加一個@EnableRabbit註解。

消費者聲明瞭一個隊列:

@RabbitListener(queues = "myQueue") 
@Component 
public class RabbitListener { 

    @Bean 
     public Queue getQueue() { 
      return new Queue("myQueue"); 
     } 

     @RabbitHandler 
     public void getElementFromMyQueue(@Payload Object object) { 

      // handle object as you want 
    } 
} 

之後,僅僅@Autowire發件人的RabbitTemplate,你應該是好去。隊列應保持空閒,但「主動」,即使主機處於關閉狀態

+0

感謝您的回答。但對於我的應用程序,我試圖手動啓動每個組件,包括連接。使用bean方法意味着所有資源都在應用程序的開始時建立。你知道是否有適當的方法可以應用於連接以確保正常處理異常和自動恢復嗎? – pike

+0

那麼,畢竟,彈簧啓動完全是關於配置的約定。所以我不會試圖重新發明輪子。但是,您也可以使用 擴展異常並將其丟棄。 Spring有一些很酷的註釋來編寫異常處理程序方法。在那邊你可以手動關閉它,或者做適合你需求的任何東西。 –