2016-09-30 15 views
1

私はスプリング3を使って開発された実行可能なjarファイルを持っています。それは定期的に@Scheduledアノテーションを使っていくつかのタスクを実行し、今、私は、春のブートがhereを提供するものと同様に、監視と分析の目的でこれらのカウンタを表示したいと考えています。実行可能なjarのカスタムエンドポイントを追加する方法

/** 
* Requester - The main entry point for this application. 
* 
*/ 
@Configuration 
@ComponentScan(basePackages = "com.tpv.req") 
@EnableScheduling 
@ImportResource({ "classpath:/spring/applicationContext-common.xml" }) 
@PropertySource(value="file:/opt/requester/requester.properties") 
public class Requester implements SchedulingConfigurer { 

protected static final Logger logger = LoggerFactory.getLogger(Requester.class); 

@Override 
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
    taskRegistrar.setScheduler(taskExecutor()); 
} 

@Bean(destroyMethod = "shutdown") 
public Executor taskExecutor() { 
    return Executors.newScheduledThreadPool(1); 
} 

@Bean 
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); 
    return pspc; 
} 

@SuppressWarnings({ "unused", "resource" }) 
public static void main(String args[]) { 
    AbstractApplicationContext context = new AnnotationConfigApplicationContext(Requester.class); 
} 

} 

@Componentクラス:

しようとしました
@Component 
public class CustomRequester { 
@Scheduled(initialDelay = 5000, fixedDelayString = "${requester.wait.time}") 
public void processRequests() { 
     //Perform some task 
} 

それは、スプリング4を必要とし、私のjarファイルは、それらの使用スプリングの依存関係を持っている3.

をここに私の@Configurationクラスであるように私は春のブートを使用することはできません@Controller:

@Controller 
@RequestMapping("/status") 
public class StatusController { 

@Autowired 
Status status; 


/** 
* @return Status object (as json) 
*/ 
@RequestMapping(method=RequestMethod.GET) 
public @ResponseBody Status doResponse() { 
    return status; 
} 

} 

これは機能しませんでした。

スプリングブートなしで同様のエンドポイントを使用できる方法はありますか?または、これらのカウンターを表示するにはどうすればよいですか?埋め込み桟橋を使用して目的を果たすことはできますか?

ありがとうございます。

+0

自分でコードを作成することはできませんか?あなたが書いたことから、別のスケジュールされた仕事が終わるまで、これらの生成されたカウンターは同じままであることを理解していますか?もしそうなら、これらの値のリポジトリのように動作するBeanを作成します。次に、このBeanリポジトリから最新の値を読み込み、アプリケーション/ json形式で提示するコントローラを追加します。完了しました。 –

+0

このアプローチを提案してくれてありがとう。私は実際に@Controllerで試しました。コントローラを使ってコードを追加するために投稿を編集しました。しかし、これはうまくいかなかった。私はちょうど瓶があるので私は思う。埋め込みWebコンテナはありません。これは正しいですか?または私は何かを逃している?基本的な質問があれば申し訳ありません。私はMVCを開始する初心者です。 – pooja

答えて

0

私はそれを理解しました。突堤を埋め込むことで簡単に問題を解決できます。メインクラスから設定クラスを分離し、メインからjettyサーバを起動するという点で、私のコードを少しリファクタリングしました。

public class ScannerStartup { 

private static Logger logger = LoggerFactory.getLogger(ScannerStartup.class); 
private static final int DEFAULT_PORT = 8080; 
private static final String CONTEXT_PATH = "/"; 
// Package of the config class 
private static final String CONFIG_LOCATION = "com.tpv.req.config"; 
private static final String MAPPING_URL = "/*"; 

public static void main(String args[]) throws Exception { 
    startJetty(getPortFromArgs(args)); 
} 

private static int getPortFromArgs(String[] args) { 
    if (args.length > 0) { 
     try { 
      return Integer.valueOf(args[0]); 
     } catch (NumberFormatException ignore) { 
     } 
    } 
    logger.debug("No server port configured, falling back to {}", DEFAULT_PORT); 
    return DEFAULT_PORT; 
} 

private static void startJetty(int port) throws Exception { 
    Server server = new Server(port); 
    server.setHandler(getServletContextHandler(getContext())); 
    server.start(); 
    logger.info("Server started at port {}", port); 
    server.join(); 
} 

private static ServletContextHandler getServletContextHandler(WebApplicationContext context) throws IOException { 
    ServletContextHandler contextHandler = new ServletContextHandler(); 
    contextHandler.setErrorHandler(null); 
    contextHandler.setContextPath(CONTEXT_PATH); 
    contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), MAPPING_URL); 
    contextHandler.addEventListener(new ContextLoaderListener(context)); 
    return contextHandler; 
} 

private static WebApplicationContext getContext() { 
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
    context.setConfigLocation(CONFIG_LOCATION); 
    return context; 
} 

}

コンフィグクラス: は、ここにコードを行く私はのAppConfigとのWebConfigとしてそれらを分離

@Configuration 
@ComponentScan(basePackages = "com.tpv.req") 
@EnableScheduling 
@PropertySource(value = "file:/opt/scanner-application.properties") 
public class AppConfig implements SchedulingConfigurer { 

protected static final Logger logger = LoggerFactory.getLogger(AppConfig.class); 

@Override 
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
    taskRegistrar.setScheduler(taskExecutor()); 
} 

@Bean(destroyMethod = "shutdown") 
public Executor taskExecutor() { 
    return Executors.newScheduledThreadPool(1); 
} 

@Bean 
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); 
    return pspc; 
} 
} 

WebMvcConfigクラス:

@Configuration 
@ComponentScan(basePackages = "com.tpv.req.controller") 
@EnableWebMvc 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {`enter code here` 
     final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     final ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 
     converter.setObjectMapper(objectMapper); 
     converters.add(converter); 
     super.configureMessageConverters(converters); 
    } 

} 

mainメソッドでScannerStartupクラスはアプリケーションコンテキストと設定クラスをロードし、 seは、プロジェクトで指定されたコンポーネントをロードし、コマンドラインから提供されたポートでjettyサーバーを実行します。いずれも設けられていない場合、それはここ8080

デフォルトのポートを使用するコントローラのクラスの例である:このコントローラは、表示され の.jar のjava -jar {jarname}

@Controller 
@RequestMapping("/status") 
public class ScannerStatusController { 

    @Autowired 
    ScannerStatus status; 

    /** 
    * @return Status object (as json) 
    */ 
    @RequestMapping(method=RequestMethod.GET) 
    public @ResponseBody ScannerStatus doResponse() { 
     return status; 
    } 

} 

だけでアプリケーションを起動しますlocalhost:8080/status

関連する問題