2009-08-24 4 views
14

एक वेब ऐप के लिए टॉमकैट में समय क्षेत्र सेट करने का सबसे अच्छा तरीका क्या है? मैंने टॉमकैट के लिए कमांड लाइन पैरामीटर या पर्यावरण चर बदलने के लिए विकल्प देखे हैं, लेकिन क्या इसे सेट करने का कोई तरीका है जो WAR फ़ाइल में स्वयं निहित है और किसी भी टोमकैट कॉन्फ़िगरेशन पर निर्भर नहीं है?मैं एक वेब ऐप के लिए टॉमकैट में टाइमज़ोन कैसे सेट करूं?

संपादित करें: पुन: जोर देने के लिए, मैं एक समाधान की तलाश में हूं जो एक WAR फ़ाइल में निहित हो सकता है, टॉमकैट कॉन्फ़िगरेशन पर निर्भर नहीं है। इसे एक और तरीका रखने के लिए, क्या एक वेब ऐप को उसी टॉमकैट इंस्टेंस में चल रहे अन्य ऐप्स की तुलना में एक अलग समय क्षेत्र रखने के लिए कॉन्फ़िगर किया जा सकता है?

+0

अच्छा प्रश्न परिभाषित करने के लिए एक वीएम तर्क का उपयोग कर सकते हैं; मैं अपने सिर को टॉमकैट इंस्टॉलेशन पर खरोंच कर रहा हूं, जहां टॉमकैट लॉग में टाइमस्टैम्प सिस्टम समय के पीछे एक घंटे हैं। –

उत्तर

8

एक ही रास्ता मैंने पाया सेटअप करने के लिए एक फिल्टर और फिल्टर में समय क्षेत्र बदलने के,

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
    TimeZone savedZone = TimeZone.getDefault(); 
    TimeZone.setDefault(webappZone); 
    chain.doFilter(request, response); 
    TimeZone.setDefault(savedZone); 
} 

setDefault() थ्रेड के लिए क्षेत्र बदल जाता है। तो फ़िल्टर के अंदर धागे में चल रहे सबकुछ में एक अलग डिफ़ॉल्ट टाइमज़ोन होगा। हमें इसे वापस बदलना होगा क्योंकि धागा अन्य ऐप्स द्वारा साझा किया जाता है। आपको अपने init(), destroy() विधियों और आपके आवेदन में शुरू होने वाले किसी अन्य थ्रेड के लिए भी ऐसा करने की आवश्यकता है।

मुझे ऐसा करना था क्योंकि एक थर्ड-पार्टी लाइब्रेरी डिफ़ॉल्ट टाइमज़ोन मानती है और हमारे पास स्रोत कोड नहीं है। यह एक गड़बड़ था क्योंकि यह लॉग टाइमज़ोन बदलता है लेकिन हम अलग-अलग समय में लॉग नहीं चाहते हैं। इसे संभालने का सही तरीका किसी भी समय अंतिम उपयोगकर्ताओं के संपर्क में आने वाले मूल्य में विशिष्ट टाइमज़ोन का उपयोग करना है।

+3

आपको इसके लिए प्रयास-अंत का उपयोग करना चाहिए। नोट, प्रसंस्करण के दौरान बनाए गए किसी भी थ्रेड उस समय सेट किए गए टाइमज़ोन का उत्तराधिकारी होगा। भविष्य के जेआरई में अलग-अलग अजीब व्यवहार हो सकते हैं। –

+0

अच्छा पकड़ो। मैं सहमत हूं कि यह भविष्य के जेआरई के साथ तोड़ सकता है क्योंकि मुझे डॉक्टर में कहीं भी नहीं दिख रहा है कि setDefault() केवल कॉलिंग थ्रेड को प्रभावित करता है। यह सब के बाद एक हैक है। इसे तब तक न करें जब तक आपको करना न पड़े। –

+0

मुझे आशा है कि आपको एहसास होगा कि यदि आपके पास एकाधिक वेबएप हैं तो यह बड़ी समय में विफल हो जाएगा। कॉलिंग setDefault() JVM में प्रत्येक एकल थ्रेड के लिए डिफ़ॉल्ट टाइमज़ोन बदलता है। –

7

CATALINA_OPTS=-Duser.timezone=America/Denver

करने के लिए सिस्टम चर सेट तुम भी रूप में अच्छी तरह $ TOMCAT_HOME/bin/catalina.sh या% TOMCAT_HOME% \ बिन \ catalina.bat फ़ाइल में CATALINA_OPTS निर्दिष्ट कर सकते हैं।

Here's a list of acceptable timezones.

Source

+3

यह समाधान टॉमकैट सर्वर के लिए समग्र समय क्षेत्र बदल जाएगा; प्रश्न लेखक प्रति वेबपैप अलग-अलग समय क्षेत्र सेट करना चाहता था। –

7

संपादित करें: मैं इस बारे में गलत था। यह संपादन इसे सुधारता है।

उत्तर यह है कि आप पोर्टेबल एक वेबपैप के लिए (डिफ़ॉल्ट) टाइमज़ोन सेट नहीं कर सकते हैं। लेकिन यदि आप जावा 6 (कम से कम) का उपयोग कर रहे हैं, तो java.util.TimeZone कक्षा एक विरासत थ्रेड स्थानीय का उपयोग कर डिफ़ॉल्ट टाइमज़ोन विधियों getDefault(), setDefault() और setDefault(TimeZone) लागू करती है। दूसरे शब्दों में, setDefault() पर कॉल करने से केवल वर्तमान धागे और भावी बाल धागे प्रभावित होते हैं।

व्यवहार सूर्य Javadocs में दस्तावेज नहीं है। यह जावा 6 और 5 (ऊपर देखें) के लिए काम करता है, लेकिन इसकी कोई गारंटी नहीं है कि यह पुराने या नए सूर्य जेआरई में काम करेगी। हालांकि, अगर मुझे सूर्य ने डिफ़ॉल्ट टाइमज़ोन के लिए 'ग्लोबल' मॉडल में बदलने/वापस करने का फैसला किया तो मुझे आश्चर्य होगा। यह बहुत से मौजूदा अनुप्रयोगों को तोड़ देगा, और ग्लोबल के अलावा बीएडी हैं।

+0

एप्लिकेशन-व्यापी ग्लोबल्स थ्रेड-बाउंड ग्लोबल्स से थोड़ा बदतर हैं ... :) –

0

SimpleTimeZone देखें। आप समय क्षेत्र आईडी के आधार पर एक उदाहरण बना सकते हैं और उस समय क्षेत्र का उपयोग करके दिनांक/समय प्रदर्शित करने के लिए इसका उपयोग कर सकते हैं। अगर आप चाहते थे, तो आप एक परियोजना विशिष्ट विन्यास फाइल से उस आईडी को पढ़ सकते हैं।

0

वेब एप्लिकेशन को संशोधित करने का सबसे अच्छा तरीका है, इसलिए यह डिफ़ॉल्ट JVM टाइमज़ोन का उपयोग करने के बजाय web.xml के माध्यम से स्पष्ट समय क्षेत्र कॉन्फ़िगरेशन स्वीकार करता है।

0
+0

** अपने उत्तर में कुछ जवाब दें **, बस एक लिंक पेस्ट न करें। अन्यथा, इसे प्रश्न के पोस्ट पर टिप्पणी के रूप में छोड़ दें। – XenoRo

+0

आपका प्रश्न कम से कम एक बार डाउनवॉट किया गया है, मैंने इसे ऊपर उठाया क्योंकि आपका उत्तर बेहतर दृष्टिकोण प्रतीत होता है। कृपया अपने उत्तर में उस यूआरएल के मुख्य बिंदु प्रदान करें, क्योंकि seamfreamwork.org हमेशा ऊपर नहीं हो सकता है। – tomdemuyt

3

JDK 6 में, सूर्य/Oracle समय-क्षेत्र के कार्यान्वयन बदल गया है। जेडीके 5.0 सेटडिफॉल्ट में टाइमज़ोन को थ्रेड स्थानीय चर में हमेशा सेट करता है और JVM में नहीं होता है और इससे कुछ समस्याएं उत्पन्न होती हैं। सूर्य ने इसे एक बग के रूप में स्वीकार किया और जेडीके 1.6 में तय किया।

JDK 1.6 में बाद अगर JVM एक सुरक्षा प्रबंधक के साथ शुरू नहीं किया गया है (या इसे System.SetsecurityManager() साथ स्थापित नहीं किया गया) (मैं दोनों JDK 1.6 और JDK 1.7 के लिए स्रोत कोड की जाँच की), setDefault विधि यह विश्व स्तर पर सेट JVM भर में और एक धागे विशिष्ट तरीके से नहीं। यदि आप इसे केवल किसी दिए गए थ्रेड के लिए सेट करना चाहते हैं तो आपको सुरक्षा प्रबंधक के साथ JVM प्रारंभ करना होगा।

जब आप सुरक्षा प्रबंधक के साथ टॉमकैट जेवीएम शुरू करते हैं तो आपको व्यक्तिगत अनुमतियां प्रदान करने की आवश्यकता होती है जो हमारे लिए कोई स्टार्टर नहीं था क्योंकि हम रिलीज चक्र में देर हो चुकी थीं। इसलिए सुरक्षा नीति फ़ाइल में हमने सभी अनुमतियां प्रदान कीं और हम टाइमज़ोन लेखन पहुंच को चुनिंदा रूप से अस्वीकार करने के लिए डिफ़ॉल्ट जावा सुरक्षा प्रबंधक को ओवरराइड कर दिया। टाइमज़ोन कक्षा के साथ आलसी प्रारंभिक मुद्दे के कारण मुझे स्थिर ब्लॉक में Timezone.getDefault() पर कॉल करने की आवश्यकता है जो सुरक्षा प्रबंधक से पहले टाइमज़ोन क्लास प्रारंभ में आता है।

यहां मेरा परीक्षण कार्यक्रम है।

--Policy फ़ाइल test.policy

grant { 
     permission java.security.AllPermission; 

}; 

- कस्टम सुरक्षा प्रबंधक

import java.security.Permission; 
import java.util.TimeZone; 


public class CustomSecurityManager extends SecurityManager { 

static { 
    TimeZone.getDefault().getDisplayName(); 
} 



public CustomSecurityManager() { 
    super(); 
} 


public void checkPermission(Permission perm) throws SecurityException,NullPointerException 
{ 

      String propertyName = perm.getName(); 
      String actionName = perm.getActions(); 
      if(propertyName != null && actionName != null) 
      { 
       if(propertyName.equalsIgnoreCase("user.timezone") 
         && actionName.equalsIgnoreCase("write")) 
       { 
        throw new SecurityException("Timezone write is not permitted."); 
       } 

      } 

} 

}

- JVM स्टार्टअप पैरामीटर

-Djava.security .manager = CustomSecurityManager -Djava.security.po licy = C: /workspace/test/src/test.policy

0
जावा 7/बिलाव 7 के साथ

, वहाँ एक समाधान/हैक है कि डेवलपर webapp प्रति एक अनूठा समय क्षेत्र सेट करने की अनुमति देता है। हमें इसे अपने आवेदन में लागू करना था, क्योंकि हमें एक ही JVM में अलग-अलग डिफ़ॉल्ट टाइमज़ोन के साथ चलने वाले एकाधिक वेबैप का समर्थन करना पड़ा था।

स्टैक ओवरफ़्लो पर मैंने जो अन्य समाधान देखा है, वे पूरी तरह से इस मुद्दे को संबोधित नहीं करते हैं।

  • टाइमज़ोन.सेटडिफॉल्ट() का उपयोग करना काम नहीं करता है, क्योंकि यह जेवीएम में टाइमज़ोन को बदलता है।
  • सर्वलेट फिल्टर का उपयोग पूरी तरह से थ्रेड असुरक्षित है, और बच्चे के धागे
  • सुरक्षा प्रबंधक का उपयोग करने से बच्चे के धागे से संबंधित टाइमज़ोन मुद्दों का भी विवरण नहीं है।

मैं भी समयक्षेत्र के लिए जावा स्रोत कोड की जांच की, मैं एक तरह से एक गतिशील समय क्षेत्र के लिए JavaAWTAccess इंटरफ़ेस का एक कस्टम कार्यान्वयन इंजेक्शन लगाने के द्वारा सभी कॉल करने के लिए डिफ़ॉल्ट समय क्षेत्र के रूप में वापस मिल गया। यह थ्रेड क्लास लोडर को देखकर और वास्तविक वेबपैप संदर्भ को निर्धारित करके किया जा सकता है, फिर कुछ वेबपैप नाम के आधार पर उचित रूप से इसे टाइमज़ोन मैपिंग पर संभाला जा सकता है।

एक बार फिर, यह एप्लिकेशन सर्वर विशिष्ट है, और टॉमकैट, जेट्टी, जेबॉस इत्यादि के लिए अलग-अलग किया जाना चाहिए।यह दृष्टिकोण भी JVM कार्यान्वयन विशिष्ट है (केवल ओरेकल/सूर्य पर काम करता है), लेकिन मुझे विश्वास है कि ओपनजेडीके और अन्य तक बढ़ाया जा सकता है।

हमारे पास ओरेकल जेडीके 7 एसई + टोमकैट 7 के लिए एक सत्यापित कार्य समाधान है, जो विंडोज और लिनक्स दोनों पर तैनात है, विभिन्न टाइमज़ोन में एकाधिक वेबएप होस्ट करता है।

+0

जेडीके 7 + टोमकैट 7 के साथ आपने क्या समाधान किया है? – Stauz

0

आप भी इसे

-Djdk.util.TimeZone.allowSetDefault=true 
संबंधित मुद्दे