2017-12-27 19 views
0

背景:「タイマー」ループで処理する場合、現在のZonedDateTime(またはDate)に「ルート」でどのようにアクセスできますか?

「設定()」メソッドは、以下のサンプルコードでは、私は現在「ZonedDateTime.now()値

を記録したい時に指定された時間間隔でループ

問題:。

ZonedDateTime.now()値がインターバル時間差にもかかわらず、常に同じ値である

質問:私は、各間隔で現在ZonedDateTime.now()値にアクセスするために使用することができますどのような技術

(注:私は最終的には、REST呼び出しのパラメータとして、この値を使用したい)

サンプルコード:

package aaa.bbb.ccc.dateparmissue; 

import java.time.ZonedDateTime; 
import java.time.format.DateTimeFormatter; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.cdi.ContextName; 

@ContextName("rest-dsl") 
public class DateParmIssue extends RouteBuilder { 

    public DateParmIssue() { 
    } 

    private final String codeList = "AA,BB,CC"; 
    private final int notifyTime = 10; //<==10 second interval 

    @Override 
    public void configure() throws Exception { 

    org.apache.log4j.MDC.put("app.name", "dateParmIssue"); 

    System.getProperties().list(System.out); 

    onException(Exception.class) 
     .log("onException_processing_exception:" + this.exceptionMessage().toString() + "...send to_error_queue:" + body(String.class).toString()) 
     .handled(true); 

    from("timer://foo?fixedRate=true&period=" + (notifyTime * 1000)) 
     .setBody(constant(this.codeList)) 
     .to("seda:node0"); 

    from("seda:node0") 
     .split().tokenize(",") 
     .to("seda:node1"); 

    from("seda:node1") 
      .log("seda:node1...body-code=${body}...zdt=" + simple(ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))); 
    }  
} 

サンプル出力...

2017-12-27 12:17:11,649 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=AA...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:11,653 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=BB...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:11,653 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=CC...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:21,630 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=AA...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:21,630 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=BB...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:21,631 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=CC...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:31,633 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=AA...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:31,636 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=BB...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
2017-12-27 12:17:31,637 | INFO | 1 - seda://node1 | route3       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | direct:node1...body-code=CC...zdt=Simple: 2017-12-27T12:17:10.306-05:00 
+0

を変更'ZonedDateTime.now()'を呼び出すと、JVMの現在のデフォルトタイムゾーンが暗黙的に適用されます。現在のデフォルトは、実行時にいつでも変更できます。 'ZonedDateTime.now(ZoneId.of(" Africa/Tunis "))'のように、あなたの望む/期待されるタイムゾーンを 'ZoneId'オブジェクトとして明示的に渡すことをお勧めします。現在のデフォルトのタイムゾーンが必要な場合は、明示的に['ZoneId.systemDefault()'](https://docs.oracle.com/javase/9​​/docs/api)を呼び出すことによって、その意図を示すためにコードを自己文書化してください。 /java/time/ZoneId.html#systemDefault--)。 –

+0

私が解決しようとしていた問題ではありませんが、私は確かにあなたの意見を取っています。ありがとう、バジル! :-) – sairn

答えて

0

「タイマー」は、ヘッダーに「firedTime」プロパティを挿入することが判明しています(現在はjava.ut新しいJava 8の日付オブジェクトの1つではなく、il.Dateオブジェクト(例えば、ZonedDateTime)。

次のように、代替があるかもしれない - すなわち、変更日時を示している...

from("seda:node1") 
    .process(new Processor(){ 
     public void process(Exchange exchange) { 
     exchange.getIn().setHeader("code", exchange.getIn().getBody().toString()); 
     exchange.getIn().setBody((new Date(exchange.getIn().getHeader("firedTime").toString()).toInstant()).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); 
     } 
    }) 
    .log("seda:node1...body-code=${in.header.code}...zdt=${body}");  

...と日付が今、ところで...

2017-12-28 15:37:18,017 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=AA...zdt=2017-12-28T15:37:18-05:00 
2017-12-28 15:37:18,019 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=BB...zdt=2017-12-28T15:37:18-05:00 
2017-12-28 15:37:18,020 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=CC...zdt=2017-12-28T15:37:18-05:00 
2017-12-28 15:37:28,017 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=AA...zdt=2017-12-28T15:37:28-05:00 
2017-12-28 15:37:28,017 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=BB...zdt=2017-12-28T15:37:28-05:00 
2017-12-28 15:37:28,018 | INFO | 7 - seda://node1 | route17       | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | seda:node1...body-code=CC...zdt=2017-12-28T15:37:28-05:00 
関連する問題