2017-11-28 10 views
0

CloudFoundryでRabbitmqサービスを接続するにはSpring Cloud Springサービスコネクタを使用します。RabbitMQを使用したSpring Cloud Springサービスコネクタ

public class CloudConfig extends AbstractCloudConfig { 

    @Bean 
    public ConnectionFactory rabbitFactory() 
    { 
     return connectionFactory().rabbitConnectionFactory(); 
    } 
} 

しかし、私はCachingConnectionFactoryを宣言し、PublisherConfirmsをtrueに設定する必要があります。キューにメッセージを送信するときには、確認のためにpublisherConfirmを使用する必要があるためです。クラウドスプリングサービスコネクタから得たconnectionFactoryをどのように注入するのか分かりません。あるいは、このような状況にどう対処できるか。あなたは次のようにコネクタによって作成されたCCF再構成することができ

答えて

2

documentationには、コネクタによって提供される接続のカスタマイズの詳細の例が含まれています。あなたのケースでは

、あなたはこのような何かを行うことができるはず:

@Bean 
public RabbitConnectionFactory rabbitFactory() { 
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put("publisherConfirms", true); 

    RabbitConnectionFactoryConfig rabbitConfig = new RabbitConnectionFactoryConfig(properties); 
    return connectionFactory().rabbitConnectionFactory(rabbitConfig); 
} 
+0

クール - 私はそれを知らなかった。メモ[typoはドキュメント](https://github.com/spring-cloud/spring-cloud-connectors/issues/220)です。実際の戻り値の型は 'org.springframework.amqp.rabbit.connection.ConnectionFactory'です。 –

+0

問題のおかげでゲーリー、私はそれを見てみましょう。 –

+0

ありがとうございました。 – Maxwell

0

@Bean 
public SmartInitializingSingleton factoryConfigurer() { 
    return new SmartInitializingSingleton() { 

     @Autowired 
     private CachingConnectionFactory connectionFactory; 

     @Override 
     public void afterSingletonsInstantiated() { 
      this.connectionFactory.setPublisherConfirms(true); 
     } 
    }; 
} 

をアプリケーションコンテキストが完全に初期化される前に、あなたは(とにかくベストプラクティスである)任意のRabbitMQの操作を実行しないように確認する必要があります。

+0

が影響設定@RabbitListenerでしょうか? – Maxwell

+0

あなたはこれをこのように設定できることを意味しますか?また、@Beanをコンフィグレーションする必要があります。 public ConnectionFactory rabbitFactory() { return connectionFactory()。rabbitConnectionFactory(); } – Maxwell

+0

Scottのソリューションが優れています。 –

0

これはRabbitTemplate

@Bean 
public RabbitTemplate rabbitTemplate() { 
    RabbitTemplate template = new RabbitTemplate(connectionFactory); 
    template.setMandatory(true); 
    template.setMessageConverter(new Jackson2JsonMessageConverter()); 
    template.setConfirmCallback((correlationData, ack, cause) -> { 
     if (!ack) { 
      System.out.println("send message failed: " + cause + correlationData.toString()); 
     } else { 
      System.out.println("Publisher Confirm" + correlationData.toString()); 
     } 
    }); 
    return template; 
} 

である。これは、春・クラウドの設定:

@Bean 
public ConnectionFactory rabbitConnectionFactory() { 
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put("publisherConfirms", true); 
    RabbitConnectionFactoryConfig rabbitConfig = new RabbitConnectionFactoryConfig(properties); 
    return connectionFactory().rabbitConnectionFactory(rabbitConfig); 
} 

この送信者を使ってメッセージを送信します。その結果は期待できません。

@Component 
public class TestSender { 

@Autowired 
private RabbitTemplate rabbitTemplate; 

@Scheduled(cron = "0/5 * * * * ? ") 
public void send() { 
System.out.println("==============================================================="); 
    this.rabbitTemplate.convertAndSend(EXCHANGE, "routingkey", "hello world", 
      (Message m) -> { 
       m.getMessageProperties().setHeader("tenant", "aaaaa"); 
       return m; 
      }, new CorrelationData(UUID.randomUUID().toString())); 
    Date date = new Date(); 
    System.out.println("Sender Msg Successfully - " + date); 
} 

}

関連する問題