Kullanabileceğim herhangi bir yöntem veya API var mı, böylece yeni bir WAR dosyasını dağıttığımda, kodun bir kısmı çalıştırılmalı veya Tomcat başladığında, ilgili sunucu sürekli olarak bir kod başlatmalı veya çalıştırmalıdır.Bir WAR dosyasını ilk dağıttığımızda bazı kod çalıştırılabilir mi?
cevap
Web.xml dosyasına "ContextListener" ekleyebilirsiniz. Bu sınıfın bir örneği, Webb uygulaması WAR dağıtımı/başlatılmasıyla ilgili olduğunda oluşturulacaktır.
Bu kod, uygulama dağıtılana kadar çalışmaya devam edecek bir iş parçacığı başlatabilir.
Örnek: Herhangi bir örneğini göstermez sadece cevap beri eski soruyu Canlandırıcı http://www.javafaq.nu/java-example-code-233.html
.
ServletContextListener
dinleyici ve yöntemlerinicontextInitialized()
vecontextDestroyed()
Uygulanışı: Bir web uygulaması WAR devreye girmemiş/dağıtıldığı veya Tomcat her başlatıldığında kod özel bir parçasını çalıştırmak için/Gerekirse, durdu.
- Tomcat uygulamanızı bilmesini sağlayın. documentation'a göre, uygulama sınıfını dağıtım tanımlayıcısına ekleyebilir,
WebListener
ile ek açıklama ekleyebilir veyaServletContext
'da tanımlananaddListener()
yöntemlerinden birini kullanarak kaydedebilirsiniz.package com.example; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener { /** The servlet context with which we are associated. */ private ServletContext context = null; @Override public void contextDestroyed(ServletContextEvent event) { log("Context destroyed"); this.context = null; } @Override public void contextInitialized(ServletContextEvent event) { this.context = event.getServletContext(); log("Context initialized"); } private void log(String message) { if (context != null) { context.log("MyServletContextListener: " + message); } else { System.out.println("MyServletContextListener: " + message); } } }
ve
web.xml
üzere aşağıdaki (veya alternatif olarak,WebListener
ek açıklama veyaaddListener()
yöntemi kullanmak) ekleyin: Burada
(this post göre) bir örnektir
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
...
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
</web-app>
ı Bazı kodları yalnızca uygulama (* .war) dağıtımında çalıştırmanın bir yolunu bulun: , en azından java servlet ile jarse uygulamaları için çalışır javax.ws.rs.core.Application kullanarak.
ApplicationConfig.java dosyasındaki uygulama (aşağıya bakın), uygulama dağıtımında çağrılan bir public getClasses yöntemini içerir. Bu nedenle, getClasses uygulamasına kod eklemek, uygulama dağıtımında yürütülmesine neden olur. Fark ettiğim tek mağara, bu fonksiyona iki kez garip geliyor, nedenini bilmiyorum, bu yüzden kodumun zaten çalışıp çalışmadığını öğrenmek için ApplicationConfig sınıfında global bir değişken ekledim. i ne yapmalıyım sonra sürekli çalıştırmak için o programı gerekiyorsa, o halde
package eu.oca;
import java.util.Set;
import javax.ws.rs.core.Application;
/**
*
* @author mattei
*/
@javax.ws.rs.ApplicationPath("jersey")
public class ApplicationConfig extends Application {
private boolean alreadyRun = false;
@Override
public Set<Class<?>> getClasses() {
System.out.println("Sidonie : ApplicationConfig : getClasses : alreadyRun = " + String.valueOf(alreadyRun));
alreadyRun = true;
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(eu.oca.ResultatGeneralAF.class);
resources.add(eu.oca.ResultatGeneralF.class);
resources.add(eu.oca.ResultatMesuresAF.class);
resources.add(eu.oca.ResultatMesuresF.class);
resources.add(eu.oca.SidonieAccueilD.class);
resources.add(eu.oca.SidonieWelcomeR.class);
}
}
: Burada
benim çözüm mü? – ayyappaBir işlemi başlatmak için System.exec dosyasını kullanabilirsiniz. Bu işlem, uygulama yapılmadığında veya kapsayıcı durduğunda bile çalışmaya devam eder. –
Efendim, dağıtımından sonra arka planda sürekli olarak çalışabilen bir sunucu uygulamasını çalıştırmam gerekiyor .. bunu nasıl yaparım? baska öneri? – ayyappa