code: public static ProducerTemplate generateTemplete(String contextUri) throws Exception
      {
          String initKey = contextUri.intern();
          synchronized (initKey)
          {
              ProducerTemplate template = templates.get(initKey);
  
              // 初期化済みの場合は、初期化済みのProducerTemplateを返す。
              if (template != null)
              {
                  return template;
              }
  
              // 初期化を行う
              Main main = new Main();
              main.setApplicationContextUri(contextUri);
              main.enableHangupSupport();
  
              // run Camel
              CamelInitializeThread initializeThread = new CamelInitializeThread(main);
              initializeThread.start();
  
              int timeCounter = 0;
  
              // keep ProducerTemplate
              while (!main.isStarted())
              {
                  try
                  {
                      TimeUnit.SECONDS.sleep(1);
                  }
                  catch (InterruptedException ex)
                  {
                      if (logger.isDebugEnabled())
                      {
                          logger.debug("Occur interrupt. Ignore interrupt.", ex);
                      }
                  }
  
                  timeCounter++;
  
                  if (INITIALIZE_TIMEOUT < timeCounter)
                  {
                      logger.error("Timed out to camel initialization. Stop to application start.");
                      throw new Exception("Camel initialization time out.");
                  }
              }
  
              // ProducerTemplateを取得する
              template = main.getCamelTemplate();
              // 初期化済みのProducerTemplateを保持する
              templates.put(initKey, template);
  
              return template;
          }
      }
docs: Camelを初期化し、送信オブジェクトを取得する。
  初期化済みのコンテキストパスを指定した場合、
  再度初期化せずに初期化済みのProducerTemplateを返す。
  
  @param contextUri コンテキストパス
  @return Camelへの送信オブジェクト
  @throws Exception 初期化失敗時