- 当项目在启动的时候需要在启动服务的时候做些业务逻辑操作。这时候你就得在web.xml配置了Servlet让他load-on-startup,当然也可以Listener 不过我是用的Servlet。
- 具体的相关xml代码
<!-- 启动时初始化jiazai -->
<!-- <servlet>
<servlet-name>InitContentServlet</servlet-name>
<servlet-class>org.casic.smartcity.pip.di.Servlet.InitContentServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitContentServlet</servlet-name>
<url-pattern>/InitContentServlet</url-pattern>
</servlet-mapping> -->
<!-- modify by taotao -->
<servlet>
<servlet-name>initContentServlet</servlet-name>
<servlet-class>org.casic.smartcity.pip.di.proxy.ServletProxy</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>initContentServlet</servlet-name>
<url-pattern>/InitContentServlet</url-pattern>
</servlet-mapping>- 我是把两个版本的都给加上了,可以让你们观察区别。因为之前的会影响一些我做了事务的Service拿不到bean,因为他是被代理了。你得到的时候转型会报错。还有就是load-on-start-up不熟悉的最好看看,对你有帮助的。
- 然后这个代理类代码如下
- `
package org.casic.smartcity.pip.di.proxy;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class ServletProxy extends GenericServlet{
private String targetBean;
private Servlet proxy;
@Override
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
proxy.service(req, res);
}
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}
package org.casic.smartcity.pip.di.Servlet;
7. 然后就是我们之前要启动服务的initservlet,注意观察就是这里我们用到了我们项目中的service之前他们做的是写了个工具,去里面拿。但是因为做了事务,他拿到的对象会是一个代理对象,这个代理对象是不能强转为你想要的service所以才需要我们的代理。也就是刚才那个,具体是这么回事。我也不清楚。我是参考人家的部分代码去修改实现了我们功能。这样来的话不影响你之前做的事务。
import java.io.IOException;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.log4j.Logger;
import org.casic.smartcity.pip.di.cache.Cache;
import org.casic.smartcity.pip.di.cache.CacheManager;
import org.casic.smartcity.pip.di.model.Dispatch;
import org.casic.smartcity.pip.di.model.User;
import org.casic.smartcity.pip.di.service.IDispatchService;
import org.casic.smartcity.pip.di.service.IExecuteKettleTaskService;
import org.casic.smartcity.pip.di.service.IKjbTemplateService;
/**
* 开启服务启动加载
* @author guochen
* 2014-12-16
*
*/
public class InitContentServlet extends GenericServlet {
@Resource
private IDispatchService dispatchService;
@Resource
private IKjbTemplateService kjbTemplateService;
@Resource
private IExecuteKettleTaskService executeKettleTaskService;
Logger logger = Logger.getLogger(InitContentServlet.class.getName());
private static final long serialVersionUID = 1L;
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* 初始化方法
*/
// @SuppressWarnings(“static-access”)
public void init(){
System.out.println(“————————-初始化模板参数方法———————————”);
Cache obj = new Cache();
String tempresult = “”;
String param = “temp”;
// KjbTemplateServiceImpl kjbTemplateService = (KjbTemplateServiceImpl)SpringContextUtil.getBean(“kjbTemplateService”);
if (CacheManager.getCacheInfo(param) == null) {
tempresult = kjbTemplateService.result();
obj.setKey(param);
obj.setValue(tempresult);
CacheManager.putCache(param, obj);
}
System.out.println(“————————-模板初始化完成———————————”);
//先获取运行状态的调度
List<Dispatch> dispatchs=dispatchService.getRunningDispachList();
//给个系统启动的默认用户
User user=new User();
user.setUserName("系统启动加载");
//执行调度
for(Dispatch d:dispatchs)
{
executeKettleTaskService.executeJobViaCarte(d, user);
}
System.out.println("-------------------------启动在执行的调度结束---------------------------------");
/* tempresult = tempresult.replaceAll(“$\{jobname\}”, job.getName());
tempresult = tempresult.replaceAll(“$\{path\}”, job.getKtrFile());
job.setKtrDescriptor(tempresult);**/
/*System.out.println(“————————-启动加载方法开启所有数据库运行状态的JOBServer———————————”);
try {
JobServerServiceImpl jobServerService = (JobServerServiceImpl)SpringContextUtil.getBean(“jobServerService”);
List list=jobServerService.initJobServerList();
JSchShell jssh=new JSchShell();
if(list!=null&&list.size()>0){
for(JobServer jsr:list){
//开启作业服务器,使用JSchShell命令监控
String sshstr=”lsof -i:”+jsr.getPort()+”“;
String result=jssh.execCmd(sshstr, jsr.getUserName(), jsr.getPassWord(), jsr.getServerAddress());
if(result!=null&&!result.equals(“”)){
logger.info(“***********端口正在被使用***********”);
String sshpid=”netstat -anp|grep “+jsr.getPort()+”|awk ‘{printf $7}’|cut -d/ -f1”;
String fwgetpid=jssh.execCmd(sshpid, jsr.getUserName(), jsr.getPassWord(), jsr.getIp());
if(fwgetpid!=null&&!fwgetpid.equals(“”)&&fwgetpid.equals(jsr.getPid())){
logger.info(“***********先关闭现在服务***********:”+fwgetpid);
WebServer webserver=new WebServer(jsr.getPort(),jsr);
webserver.stopServer(jsr.getPort(),jsr);
/***********重新开启服务************
SlaveServerConfig config = new SlaveServerConfig(KettleConstants.SLAVE_IP, jsr.getPort(), false);
Carte.runCarte(config);
String sshpidnew=”netstat -anp|grep “+jsr.getPort()+”|awk ‘{printf $7}’|cut -d/ -f1”;
String pid=jssh.execCmd(sshpidnew, jsr.getUserName(), jsr.getPassWord(), jsr.getIp());
logger.info(“***********重新开启服务***********:”+pid);
jsr.setPid(pid);
jsr.setStatus(1);
}else{
logger.info("*********************端口正在被使用,不是数据库中的PID*********************");
jsr.setPid("");
jsr.setStatus(2);
}
}else{
logger.info("*********************端口未被使用直接启动*********************");
SlaveServerConfig config = new SlaveServerConfig(KettleConstants.SLAVE_IP, jsr.getPort(), false);
Carte.runCarte(config);
String sshpid="netstat -anp|grep "+jsr.getPort()+"|awk '{printf $7}'|cut -d/ -f1";
String pid=jssh.execCmd(sshpid, jsr.getUserName(), jsr.getPassWord(), jsr.getIp());
jsr.setPid(pid);
jsr.setStatus(1);
}
jobServerService.updateJobserver(jsr);
}
}
System.out.println("-------------------------启动Server完成---------------------------------");
} catch (Exception e) {
e.printStackTrace();
}*/
}
}
`
8. 然后就是在spring容器里配置InitServlet,这个我理解的是你只有配置了。然后代理对象才能根据xml里的映射。去取到这个bean。所以得在xml里配置这个bean 。注意这个bean的name属性得和你xml里代理类的servlet映射一样。具体待会会给你链接,你可以去下载人家的部分代码参考。注意观察name与xml里的代理类Servlet,他当时说的好像是注解也行。我试的时候注解不行。就改的配置文件了。你可以的话可以注解。
以上大概就是你项目里能用到的。这些估计能帮助到你了。还有一个就是在你项目里可能会遇到一些调度线程类,会用到service,这时候你非要给他注入对象,会一直拿不到。具体什么原因。不是太明白。或许过几天就能想起来。这时候你可以仿照这个,去做个代理类,让代理类去拿注入这些service,然后你的这个代理类在配置文件里配置一下,记得这个好像是只能在配置文件,然后你写个工具类去拿配置文件里的对象,然后转型。去做你的业务操作,这样你的事务还是不会影响。改天有时间会将那篇也给发布上去吧。反正具体的还是自己去钻研,查阅资料。
下面把之前那个连接给你发了,就是我参考的资源,地址不见了,就把他的文件内容给你发下面做参考吧,你听不懂我说的,可以参照他的,它的简单做个实现。你应该能解决你项目的问题了
利用代理类,这样仍然可以去spring容器里,让spring去为我们分配资源,这样避免了一些后边的事务冲突
严重: Servlet /xcfhinvoices threw load() exception
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:117)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.core.DefaultInstanceManager.lookupMethodResource(DefaultInstanceManager.java:625)
at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:471)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:162)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1120)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1678)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
因为少用了个代理器,加上代理器就好了。代理器如下:
Xml文件
<servlet>
<description></description>
<display-name>ServiceInfoServlet</display-name>
<servlet-name>serviceInfoServlet</servlet-name> 这里的名跟servlet类中的注解名一样
<servlet-class>com.xcfh.invoice.controller.ServiceInfoServletProxy</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
代理类
public class ServiceInfoServletProxy extends GenericServlet{
private String targetBean;
private Servlet proxy;
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
// TODO Auto-generated method stub
proxy.service(req, res);
}
private void getServletBean(){
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}
Servlet类
@Component("serviceInfoServlet")
public class ServiceInfoServlet extends HttpServlet{
private ServiceInfoSerivce serviceInfoService;
public ServiceInfoSerivce getServiceInfoService() {
return serviceInfoService;
}
@ Resource(name = "ServiceInfoSerivce")
public void setServiceInfoService(ServiceInfoSerivce serviceInfoService) {
this.serviceInfoService = serviceInfoService;
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
serviceInfoService.loadServiceInfo();
}
}