项目里需要在服务启动时进行一些业务逻辑

  1. 当项目在启动的时候需要在启动服务的时候做些业务逻辑操作。这时候你就得在web.xml配置了Servlet让他load-on-startup,当然也可以Listener 不过我是用的Servlet。
  2. 具体的相关xml代码
  3. <!-- 启动时初始化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>
  4. 我是把两个版本的都给加上了,可以让你们观察区别。因为之前的会影响一些我做了事务的Service拿不到bean,因为他是被代理了。你得到的时候转型会报错。还有就是load-on-start-up不熟悉的最好看看,对你有帮助的。
  5. 然后这个代理类代码如下
  6. `
    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);
}

}

7. 然后就是我们之前要启动服务的initservlet,注意观察就是这里我们用到了我们项目中的service之前他们做的是写了个工具,去里面拿。但是因为做了事务,他拿到的对象会是一个代理对象,这个代理对象是不能强转为你想要的service所以才需要我们的代理。也就是刚才那个,具体是这么回事。我也不清楚。我是参考人家的部分代码去修改实现了我们功能。这样来的话不影响你之前做的事务。
package org.casic.smartcity.pip.di.Servlet;

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();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值