2014-07-23 5 views
1

RabbitMQ가 아닌 수신기를 통해 메시지를 수신하고 RabbitMQ를 통해 메시지를 처리하고 전달하는 Spring 3 애플리케이션이 있습니다. 메시지가 전송 될 때마다 새로운 RabbitMQ 연결이 생성됩니다. 이것은 약간 낭비가 보인다. 나는 이것이 정말로 필요한지 아니면 연결이 싱글 톤으로 유지 될 수없고 단지 여러 번 보내기를 위해서만 만들어 질 수있는 이유가 있는지 궁금 할 것입니다.메시지를 보낼 때마다 RabbitMQ 연결을 다시 작성해야합니까?

private void send(String routingKey, String message) throws Exception { 
    String exchange = applicationConfiguration.getAMQPExchange(); 
    String ipAddress = applicationConfiguration.getAMQPHost(); 
    String exchangeType = applicationConfiguration.getAMQPExchangeType(); 
    String password = applicationConfiguration.getAMQPUser(); 
    String user = applicationConfiguration.getAMQPPassword(); 
    String virtualHost = applicationConfiguration.getAMQPVirtualHost(); 
    String port = applicationConfiguration.getAMQPPort(); 

    ConnectionFactory factory = new ConnectionFactory(); 
    factory.setUsername(user); 
    factory.setPassword(password); 
    factory.setVirtualHost(virtualHost); 
    factory.setPort(Integer.parseInt(port)); 
    factory.setHost(ipAddress); 

    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); 
    channel.exchangeDeclare(exchange, exchangeType); 
    channel.basicPublish(exchange, routingKey, null, message.getBytes()); 

    log.debug(" [AMQP] Sent message with key {} : {}",routingKey, message); 

    connection.close(); 
} 

또는 가능한 싱글 :

public class MyConnection { 
    private static MyConnection singleton = new MyConnection(); 
    private static Connection connection; 

    private MyConnection() { 
     ConnectionFactory factory = new ConnectionFactory(); 
     String exchange = applicationConfiguration.getAMQPExchange(); 
     String ipAddress = applicationConfiguration.getAMQPHost(); 
     String exchangeType = applicationConfiguration.getAMQPExchangeType(); 
     String password = applicationConfiguration.getAMQPUser(); 
     String user = applicationConfiguration.getAMQPPassword(); 
     String virtualHost = applicationConfiguration.getAMQPVirtualHost(); 
     String port = applicationConfiguration.getAMQPPort(); 

     try { 
      factory.setUsername(user); 
      factory.setPassword(password); 
      factory.setVirtualHost(virtualHost); 
      factory.setPort(Integer.parseInt(port)); 
      factory.setHost(ipAddress); 
      connection = factory.newConnection(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static Connection getInstance() { 
     return connection; 
    } 
} 
+0

호 적어도 경우 싱글을 만들 수없는 한 가지 방법입니다 연결 또는 소켓 레벨 오류. – pinepain

답변

3

가 연결이 싱글이 될 수 있으며, 여러 전송을 위해 공유 할 수 있습니다이 보내는 방법입니다. 채널은 스레드 용 채널이어야합니다.

당신 코드 수 :

private void send(String routingKey, String message) throws Exception { 
    Connection connection = MyConnection().getInstance(); 

    Channel channel = connection.createChannel(); 
    channel.exchangeDeclare(exchange, exchangeType); 
    channel.basicPublish(exchange, routingKey, null, message.getBytes()); 
    log.debug(" [AMQP] Sent message with key {} : {}",routingKey, message); 
    channel.close(); 
} 

각 게시에 대한 채널을 생성하고 파괴하기로 결정, 또는 스레드를 생성하고 항상 같은 채널을 다시 사용할 수 있습니다. sigleton를 생성하기 위해

편집 ** 는 여기에 읽기 : http://javarevisited.blogspot.it/2012/12/how-to-create-thread-safe-singleton-in-java-example.html

public class MySingletonConnection{ 
    private static final MySingletonConnection INSTANCE = new MySingletonConnection(); 
    private Connection myConnection; 
    private Singleton(){ 
     // here you can init your connection parameter 
    } 

    public static MySingletonConnection getInstance(){ 
     return INSTANCE; 
    } 

public Connection getConnection() { 
    return connection; 
} 
} 

이 더이 있습니다

private void send(String routingKey, String message) throws Exception { 
    Connection connection = MySingletonConnection().getInstance().getConnection(); 
+0

고맙습니다. 위 코드를 추가했습니다. 이것이 맞는지 확실하지 않습니다. – skyman

+1

답변을 수정했습니다. – Gabriele

+0

감사합니다. Connection을 getInstance 메소드로 리턴 한 Singleton을 생성하는 방법을 잘 모르겠습니다 ... 좋습니다. 정말로 도움을 주셔서 감사합니다. – skyman

관련 문제