2016-11-24 2 views
1

rabbitmqからのメッセージを消費すると、マルチスレッドを実装してjiraで何らかの操作を実行しました。私はspring amqp(バージョン1.6.1)を使用していますアプリケーションコンテキストが閉じられ、ConnectionFactoryが接続を作成できなくなりました。Spring AMQP

スレッドが例外をキャッチすると、私はエラーとしてステータスを設定しています。この出力オブジェクトをキューに送信している間私はexecptionの上に直面しています

コード:

接続ファクトリー:

@Configuration 
@PropertySources({ @PropertySource("classpath:application.properties") }) 
public class RabbitMQConfiguration { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public ConnectionFactory connectionFactory() { 

     // TODO make it possible to customize in subclasses. 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(environment.getProperty("bip.rabbitmq.url")); 
     connectionFactory.setUsername(environment.getProperty("bip.rabbitmq.username")); 
     connectionFactory.setPassword(environment.getProperty("bip.rabbitmq.password")); 
     return connectionFactory; 
    } 

    @Bean 
    public MessageConverter jsonMessageConverter() { 
     return new Jackson2JsonMessageConverter(); 
    } 

    /** 
    * @return the admin bean that can declare queues etc. 
    */ 
    @Bean 
    public AmqpAdmin amqpAdmin() { 
     RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory()); 
     return rabbitAdmin; 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     template.setMessageConverter(jsonMessageConverter()); 
     return template; 
    } 

    @Bean(name = "jiraQueueListenerContainerFactory") 
    public SimpleRabbitListenerContainerFactory jiraQueueListenerContainerFactory() { 
     SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory()); 
     factory.setMessageConverter(new Jackson2JsonMessageConverter()); 
     factory.setReceiveTimeout(10L); 
     return factory; 
    } 

} 

MessageHandlerの:

@Component 
@PropertySources({ @PropertySource("classpath:application.properties") }) 

public class JiraMessageHandler { 

    @Autowired 
    private RabbitTemplate rabbitTemplate; 

    private static ExecutorService executor = Executors.newFixedThreadPool(Constants.THREAD_SIZE); 

    private static Logger logger = LogManager.getLogger(JiraMessageHandler.class); 

    @RabbitListener(containerFactory = "jiraQueueListenerContainerFactory", queues = Constants.QUEUE_NAME) 
    public void handleMessage(HashMap<String, Object> jiraMessage) { 

     logger.info(jiraMessage.toString() + System.currentTimeMillis()); 
     logger.info("Jira Message Handler"); 
     BaseServerAdapter jiraProcessingAdapter = new JiraProcessingAdapter(); 
     Future future = executor.submit(jiraProcessingAdapter); 
     JiraAdapterOutput jiraAdapterOutput = new JiraAdapterOutput(); 
     Future future = executor.submit(jiraProcessingAdapter); 
     jiraAdapterOutput = (JiraAdapterOutput) future.get(); 
     try { 
      jiraAdapterOutput = (JiraAdapterOutput) future.get(); 

      if (jiraAdapterOutput.getOutputMap().get("activityStatus") == "SUCCESS") { 
       logger.info("Successfully Executed Jira ::: " + new Date() + "::: " 
         + jiraAdapterOutput.getOutputMap().get("jiraId")); 
         rabbitTemplate.convertAndSend(Constants.ADAPTER_OUTPUT_QUEUE, senderMap); 
      }else if (jiraAdapterOutput.getOutputMap().get("activityStatus").equalsIgnoreCase("FAIL")) { 
       logger.info("Successfully Executed Jira ::: " + new Date() + "::: " 
         + jiraAdapterOutput.getOutputMap().get("jiraId")); 
         sendMessageForProcessingToBIP(senderMap); 
      } 

     private boolean sendMessageForProcessingToBIP(HashMap<String, ExchangeDTO> senderMap) { 
     try { 
      rabbitTemplate.convertAndSend(Constants.WFM_ERROR_QUEUE, senderMap); 
      return true; 
     } catch (Exception e) { 
      **logger.info("Message sending failed, try again:::::::" + e.getMessage());** 
     } 
     return false; 

    } 

それは、「アプリケーション・コンテキストが閉じられ、ConnectionFactoryのは、もはや作成することはできません表示されます接続。 "

何か間違っています。 私はここでも参考にしています:https://jira.spring.io/browse/AMQP-546

答えて

0

上記のコードは(handleMessage内で)不完全に見えます。tryのキャッチはありません。

送信を試行する前に、アプリケーションコンテキストを閉じておく必要があります。 Beanがクローズ/破棄された後は、コンテキスト内でBeanを使用することはできません。あなたが参照しているJIRAは、他のBean内のメソッドにこのようなアクセスを許可することでした。つまり、ほかのすべてのBeanが停止した後にのみ接続を破棄しました。

私はorg.springframeworkのDEBUGログを有効にして、コンテキストが時期尚早に閉じられている理由を理解することをお勧めします。

+0

キャッチブロックを追加しないと申し訳ありません。問題がJiraに届いている場合は、メッセージを送信できます。その瞬間、私はウサギテンプレート**を誤って**閉鎖しています。しかし、いくつかの欠落したパラメータのためにjiraで問題を作成できないときは、そこからブロックをキャッチして、エラーキューに送信しているので**実際に**閉鎖されたことを示します。 – Chandan

+0

私が言ったように、その例外を取得するには、コンテキストを閉じる必要があります。 DEBUGロギングをオンにします。私はそのログなしでは助けにならない。 –

+0

DEBUGロギングを有効にする方法を教えてください。時々、私はロガーの最初の行にメッセージが表示されたら、接続をチェックしています**実際にはコンテキストクローズ** – Chandan

関連する問題