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
キャッチブロックを追加しないと申し訳ありません。問題がJiraに届いている場合は、メッセージを送信できます。その瞬間、私はウサギテンプレート**を誤って**閉鎖しています。しかし、いくつかの欠落したパラメータのためにjiraで問題を作成できないときは、そこからブロックをキャッチして、エラーキューに送信しているので**実際に**閉鎖されたことを示します。 – Chandan
私が言ったように、その例外を取得するには、コンテキストを閉じる必要があります。 DEBUGロギングをオンにします。私はそのログなしでは助けにならない。 –
DEBUGロギングを有効にする方法を教えてください。時々、私はロガーの最初の行にメッセージが表示されたら、接続をチェックしています**実際にはコンテキストクローズ** – Chandan