PDA

View Full Version : سوال: Application scope in spring framework



shani1367
یک شنبه 12 شهریور 1391, 11:08 صبح
با سلام

برای انجام پروژه ای نیاز دارم که 10 ثانیه یک بار اطلاعاتی رو از فایل خونده و در database ذخیره کنم برای اینکه هر 10 ثانیه این کارانجام شود از quartz استفاده می کنم اما نمی دونم کجا باید این کلاس رو فراخوانی کنم که با start سرور کارش رو شروع کنه و در تمام مدت Scope خودش رو نگه دارد ؟

spring 3
jsf 1.2
server:apache tomcat

javaphantom
یک شنبه 12 شهریور 1391, 12:27 عصر
با سلام

برای انجام پروژه ای نیاز دارم که 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-quartz-scheduler-example/

shani1367
یک شنبه 12 شهریور 1391, 12:52 عصر
در context spring از آن با scope پیشفرض instance بگیری مشکلی نداره
scope پیشفرض singleton هست.

به لینک یک نگاه بکن
http://www.mkyong.com/spring/spring-quartz-scheduler-example/

سلام و تشکر
من از anotation ها استفاده می کنم
یعنی اگر کلاسم رو اینجوری بنویسم حل میشه؟


@Scope("singleton")
@Component("FooComponent")
public class FooComponentImpl implements FooComponent {

javaphantom
یک شنبه 12 شهریور 1391, 14:34 عصر
سلام و تشکر
من از 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@ دادی

shani1367
یک شنبه 12 شهریور 1391, 15:43 عصر
همانطور که گفتم 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 رو از کلاسی اسکن نمیشه فراخوانی کنم :ناراحت:
اگر منبعی برای مطالعه داشته باشین ممنون می شم در اختیار من قرار بدین

تشکر

javaphantom
یک شنبه 12 شهریور 1391, 16:07 عصر
ممنون از 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.ContextLoaderListe ner</listener-class>
</listener>

shani1367
دوشنبه 13 شهریور 1391, 10:38 صبح
با سلام و تشکر از شما
ممنون از مطالب خوبتون،من هر دو مورد رو در web.xml دارم و پروژه ام اجرا می شه

ااما سوال من این هست :
من کلاسی می خوام داشته باشم که وقتی سرور من اجرا می شه بدون درخواست هیچ request ی بتونه اجرا بشه و هر 10 ثانیه یه بار کاری که من می خوام رو انجام بده؛ آیا با استفاده از همین پروژه می تونم این کار رو انجام بدم؟ یا اینکه باید یه جاوا اپلیکیشن بنویسم و همراه با استارت سرور اون رو هم ران کنم؟ یا اصلا tomcat امکانی برای انجام این کار داره؟

ممنون از توجه شما

javaphantom
دوشنبه 13 شهریور 1391, 11:58 صبح
با سلام و تشکر از شما
ممنون از مطالب خوبتون،من هر دو مورد رو در web.xml دارم و پروژه ام اجرا می شه

ااما سوال من این هست :
من کلاسی می خوام داشته باشم که وقتی سرور من اجرا می شه بدون درخواست هیچ request ی بتونه اجرا بشه و هر 10 ثانیه یه بار کاری که من می خوام رو انجام بده؛ آیا با استفاده از همین پروژه می تونم این کار رو انجام بدم؟ یا اینکه باید یه جاوا اپلیکیشن بنویسم و همراه با استارت سرور اون رو هم ران کنم؟ یا اصلا tomcat امکانی برای انجام این کار داره؟

ممنون از توجه شما

lمعلومه که داره، اگر نداشت باید می انداختیش دور.

servlet ها. من توی این سایت هزار بار به جای کلمه تام کت یا وب اپیلیکیشن از کلمه servlet container استفاده کردم و باز به اسرار هی حرف خودشون رو می زنند. مهم نیست. مام حرف خودمون رو می زنیم.

سرولت ها کلاس هایی هستند که از طریق سرولت کانتینرها مدیریت می شوند. اگر یک سرولت تعریف کنی توی همون web.xml می تونی معرفی کنی و وقتی اومد بالا برنامت ران بشه.

اما دقیقا context spring هم داره همین کار رو برات می کنه. می گی نه. توی constructor کلاسی که می خوای وقتی برنامه اومد بالا بره ازش new کنه یک log بزن. بندازش توی spring context و همون کارایی که بهت گفتم بکن خودت می بینی وقتی context اومد بالا log زده می شه

shani1367
دوشنبه 13 شهریور 1391, 13:05 عصر
بله! مرسی
داشت من کلاسمو با این 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" />

ممنون میشم این مرحله اش هم همراهی کنید.

javaphantom
دوشنبه 13 شهریور 1391, 19:47 عصر
بله! مرسی
داشت من کلاسمو با این 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" />

ممنون میشم این مرحله اش هم همراهی کنید.

دیگه یکدومشه نه هر جفتش

shani1367
دوشنبه 13 شهریور 1391, 21:16 عصر
دیگه یکدومشه نه هر جفتش
بااین 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 هم حل نشد!
امیدوارم مشکلم رو درست بیان کرده باشم :افسرده::ناراحت:

shani1367
پنج شنبه 16 شهریور 1391, 11:24 صبح
با تشکر از شما

مشکلم حل شد.