Application scope in spring framework
	
	
		با سلام
برای انجام پروژه ای نیاز دارم که 10 ثانیه یک بار اطلاعاتی رو از  فایل خونده و در database ذخیره کنم برای اینکه هر 10 ثانیه این کارانجام شود از quartz استفاده می کنم اما نمی دونم کجا باید این کلاس رو فراخوانی کنم که با start  سرور کارش رو شروع کنه و در تمام مدت Scope خودش رو نگه دارد ؟
spring 3
jsf 1.2
server:apache tomcat
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
shani1367
				
			 
			با سلام
برای انجام پروژه ای نیاز دارم که 10 ثانیه یک بار اطلاعاتی رو از  فایل خونده و در database ذخیره کنم برای اینکه هر 10 ثانیه این کارانجام شود از quartz استفاده می کنم اما نمی دونم کجا باید این کلاس رو فراخوانی کنم که با start  سرور کارش رو شروع کنه و در تمام مدت Scope خودش رو نگه دارد ؟
spring 3
jsf 1.2
server:apache tomcat
			
		
	 
 در context spring از آن با scope پیشفرض instance بگیری مشکلی نداره
scope پیشفرض singleton هست. 
به لینک یک نگاه بکن 
http://www.mkyong.com/spring/spring-...duler-example/
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
javaphantom
				
			 
			
			
		
	 
 سلام و  تشکر 
من از anotation ها استفاده می کنم
یعنی اگر کلاسم رو اینجوری بنویسم حل میشه؟
@Scope("singleton")
@Component("FooComponent")
public class FooComponentImpl implements FooComponent { 
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
shani1367
				
			 
			سلام و  تشکر 
من از anotation ها استفاده می کنم
یعنی اگر کلاسم رو اینجوری بنویسم حل میشه؟
@Scope("singleton")
@Component("FooComponent")
public class FooComponentImpl implements FooComponent { 
 
			
		
	 
 
همانطور که گفتم scope پیشفرض همیشه در spring همان singleton هست پس اگرم نذاشتی نزاشتی.
در مورد @Component که زدی فقط باید حواست باشه که توی xml فایلی که داری تو appcontext می یاریش بالا یا همان load می کنی 
<context:annotation-config/>
<context:component-scan base-package=""/>
 رو اعمال کرده باشی تا بتونه اسکن کنه و کلاس رو instance بگیره. و در جای دیگه این کلاس رون lookup  یا inject کنی با همون نامی که توی Component@ دادی
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
javaphantom
				
			 
			همانطور که گفتم scope پیشفرض همیشه در spring همان singleton هست پس اگرم نذاشتی نزاشتی.
در مورد @Component که زدی فقط باید حواست باشه که توی xml فایلی که داری تو appcontext می یاریش بالا یا همان load می کنی 
<context:annotation-config/>
<context:component-scan base-package=""/>
 رو اعمال کرده باشی تا بتونه اسکن کنه و کلاس رو instance بگیره. و در جای دیگه این کلاس رون lookup  یا inject کنی با همون نامی که توی Component@ دادی
 
			
		
	 
 ممنون از link قبلی اما من تو پروژه کلاسی که متد main داشته باشه ندارم یعنی یه webApplication دارم ایا باید کلاسی با متد main داشته باشم؟
بله در حال حاضر این کلاس اسکن می شه و کاری که می خوام انجام میشه
اما می خوام کلاس از زمان شروع کار سرور کارش رو شروع کنه نه زمانی که reuqest میرسه،یعنی در حال حاضر حتما باید از طریق درخواست browser یه بار این کلاس صدا زده بشه .اما نباید اینطور باشه.میشه چنین کاری کرد؟
شاید من اصلا نباید از component یا controller استفاده کنم و باید با کلاس های ساده این کار رو انجام بدم اما من برای ذخیره در database از Dao استفاده می کنم اما نمی تونم این Dao  رو از کلاسی اسکن نمیشه فراخوانی کنم :ناراحت:
اگر منبعی برای مطالعه داشته باشین ممنون می شم در اختیار من قرار بدین
تشکر
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
shani1367
				
			 
			ممنون از link قبلی اما من تو پروژه کلاسی که متد main داشته باشه ندارم یعنی یه webApplication دارم ایا باید کلاسی با متد main داشته باشم؟
بله در حال حاضر این کلاس اسکن می شه و کاری که می خوام انجام میشه
اما می خوام کلاس از زمان شروع کار سرور کارش رو شروع کنه نه زمانی که reuqest میرسه،یعنی در حال حاضر حتما باید از طریق درخواست browser یه بار این کلاس صدا زده بشه .اما نباید اینطور باشه.میشه چنین کاری کرد؟
شاید من اصلا نباید از component یا controller استفاده کنم و باید با کلاس های ساده این کار رو انجام بدم اما من برای ذخیره در database از Dao استفاده می کنم اما نمی تونم این Dao  رو از کلاسی اسکن نمیشه فراخوانی کنم :ناراحت:
اگر منبعی برای مطالعه داشته باشین ممنون می شم در اختیار من قرار بدین
تشکر
			
		
	 
 تو web داستانش فرق می کنه برای اینکه بخوای context بیاری بالا.  اون فایل xml ی که context شما هست رو در داخل classpath برنامه قرار بده. بطوری و بعد در فایل web.xml این تغییرات رو باید داشته باشی که هنگامی که داره پروژه deploy می شه  context ها یکی یکی  بالا بیان
اول باید یک همچین چیزی داشته باشی که xml فایل های مربوط به spring رو معرفی کنی
برای مثال
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/applicationContext-resources.xml
            classpath:/applicationContext-dao.xml  <!--core module-->
            classpath*:/applicationCoreContext.xml <!--core module-->
            /WEB-INF/applicationContext*.xml
            /WEB-INF/cxf-servlet.xml
            <!--/WEB-INF/security.xml-->
        </param-value>
    </context-param>
گام دوم باید بهش بفهمونی که از این context ها می خوام استفاده کنم برای ineject  یا lookup
 <listener>
        <listener-class>org.springframework.web.context.ContextLoade  rListener</listener-class>
    </listener>
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		با سلام و تشکر از شما
ممنون از مطالب خوبتون،من هر دو مورد رو در web.xml دارم و پروژه ام اجرا می شه
ااما سوال من این هست :
من کلاسی می خوام داشته باشم که وقتی سرور من اجرا  می شه بدون درخواست هیچ request ی بتونه اجرا بشه و هر 10 ثانیه یه بار کاری که من می خوام رو انجام بده؛ آیا با استفاده از همین  پروژه می تونم این کار رو انجام بدم؟ یا اینکه باید یه جاوا اپلیکیشن بنویسم و همراه با استارت سرور اون رو هم ران کنم؟ یا اصلا tomcat  امکانی برای انجام این کار داره؟
ممنون از توجه شما
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
shani1367
				
			 
			با سلام و تشکر از شما
ممنون از مطالب خوبتون،من هر دو مورد رو در web.xml دارم و پروژه ام اجرا می شه
ااما سوال من این هست :
من کلاسی می خوام داشته باشم که وقتی سرور من اجرا  می شه بدون درخواست هیچ request ی بتونه اجرا بشه و هر 10 ثانیه یه بار کاری که من می خوام رو انجام بده؛ آیا با استفاده از همین  پروژه می تونم این کار رو انجام بدم؟ یا اینکه باید یه جاوا اپلیکیشن بنویسم و همراه با استارت سرور اون رو هم ران کنم؟ یا اصلا tomcat  امکانی برای انجام این کار داره؟
ممنون از توجه شما
			
		
	 
 lمعلومه که داره، اگر نداشت باید می انداختیش دور.
servlet ها.  من توی این سایت هزار بار به جای کلمه تام کت یا وب اپیلیکیشن از کلمه servlet container استفاده کردم و باز به اسرار هی حرف خودشون رو می زنند. مهم نیست. مام حرف خودمون رو می زنیم.
سرولت ها کلاس هایی هستند که از طریق سرولت کانتینرها مدیریت می شوند. اگر یک سرولت تعریف کنی توی همون web.xml می تونی معرفی کنی و وقتی اومد بالا برنامت ران بشه.
اما دقیقا context spring هم داره همین کار رو برات می کنه. می گی نه. توی constructor کلاسی که می خوای وقتی برنامه اومد بالا بره ازش new کنه یک log بزن. بندازش توی spring context و همون کارایی که بهت گفتم بکن  خودت می بینی وقتی context اومد بالا log زده می شه
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		بله! مرسی 
داشت من کلاسمو با این listener تو web.xml صدا میزنم و اجرا می شه هر 10 ثانیه یه بار اما فقط خطا داره :ناراحت:
<listener>
		<listener-class>
			org.quartz.ee.servlet.QuartzInitializerListener
		</listener-class>
	</listener>
آیا این همون انداختن تو context هست؟ 
یعنی در حقیقت  هلان مشکل من همونه که dao و services ها رو تو این کلاس نمیشناسه،با اینکه معرفیش کردم تو فایل services_context اما خطا داره !!!
<context:component-scan base-package="com.anisa.quartz" scoped-proxy="targetClass" />
ممنون میشم این مرحله اش هم همراهی کنید.
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
shani1367
				
			 
			بله! مرسی 
داشت من کلاسمو با این listener تو web.xml صدا میزنم و اجرا می شه هر 10 ثانیه یه بار اما فقط خطا داره :ناراحت:
<listener>
		<listener-class>
			org.quartz.ee.servlet.QuartzInitializerListener
		</listener-class>
	</listener>
آیا این همون انداختن تو context هست؟ 
یعنی در حقیقت  هلان مشکل من همونه که dao و services ها رو تو این کلاس نمیشناسه،با اینکه معرفیش کردم تو فایل services_context اما خطا داره !!!
<context:component-scan base-package="com.anisa.quartz" scoped-proxy="targetClass" />
ممنون میشم این مرحله اش هم همراهی کنید.
 
			
		
	 
 دیگه یکدومشه نه هر جفتش
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		
	نقل قول:
	
		
		
			
				نوشته شده توسط 
javaphantom
				
			 
			دیگه یکدومشه نه هر جفتش
			
		
	 
 بااین  listener که نوشتم  کلاس job رو که برای quartz نوشتم  معرفی می کنم حالا تو این کلاس یه کلاس از نوع services رو فراخوانی می کنم که کلاسش این جوری هست :
public class SchedulerListener implements Job {
	List<String> fooList;
	Foo Foo;
	private int lastCounter=0; 
	
	@Autowired
	private FooService fooService;
	
	@SuppressWarnings("unchecked")
	public void readFileToList() {
		try {
			File file = new File(
					"F:\\JAVA\\work\\SPRING WORK\\projects\\AniFooMonitoring\\foo.txt");
			fooList = FileUtils.readLines(file);
			savelinesToDb();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void savelinesToDb() {
		
		int toIndex = fooList.size();
		System.out.println("last:counter:"+lastCounter +"    ToIndex:"+toIndex);
		fooList = fooList.subList(lastCounter, toIndex);
		fooService.savelinesToDb(fooList);
		lastCounter = toIndex;		
		System.out.println("last:counter:"+lastCounter +"    ToIndex:"+fooList.size());
		
	}
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println("*****************Start RUN Trigger*************");
		readFileToList();	
		System.out.println("*****************Start RUN Trigger*************");	
	}
	{ 
اما زمانی که می خواد اجرا بشه  به محض رسیدن به این خط :
fooService.savelinesToDb(fooList);
خطا میده:
Caused by: java.lang.NullPointerException
که به دلیل استفاده از Services هست اما با همون معرفی در context هم حل نشد!
امیدوارم مشکلم رو  درست بیان کرده باشم :افسرده::ناراحت:
	 
	
	
	
		نقل قول: Application scope in spring framework
	
	
		با تشکر از شما
مشکلم حل شد.