您的位置:首页 > 其它

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

2015-04-21 14:31 246 查看
当项目在启动的时候需要在启动服务的时候做些业务逻辑操作。这时候你就得在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);
}


}

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(“[b]***********[/b]端口正在被使用[b]***********[/b]”);

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(“[b]***********[/b]先关闭现在服务[b]***********[/b]:”+fwgetpid);

WebServer webserver=new WebServer(jsr.getPort(),jsr);

webserver.stopServer(jsr.getPort(),jsr);

/[b]***********[/b]重新开启服务[b]************[/b]

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(“[b]***********[/b]重新开启服务[b]***********[/b]:”+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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: