2017-12-27 46 views
0

배경 : 나는 현재 "ZonedDateTime.now() 값"타이머"루프로 처리 할 때 "경로"에서 현재 ZonedDateTime (또는 Date)에 액세스하려면 어떻게합니까?

을 기록하고자하는 시간에

은"구성은() "방법은 아래의 샘플 코드에서 지정된 시간 간격으로 루프

문제점 :.

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 날짜 객체 중 하나 (예 : ZonedDateTime)가 아닌 il.Date 객체. 다음과 같이

그래서, 대안이 될 수있다 - 즉, 변화하는 날짜를 표시하는 ...

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