项目里需要在服务启动时进行一些业务逻辑
2015-04-21 14:31
246 查看
当项目在启动的时候需要在启动服务的时候做些业务逻辑操作。这时候你就得在web.xml配置了Servlet让他load-on-startup,当然也可以Listener 不过我是用的Servlet。
具体的相关xml代码
我是把两个版本的都给加上了,可以让你们观察区别。因为之前的会影响一些我做了事务的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;
}
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 {
// @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(“————————-模板初始化完成———————————”);
/* 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);
}
以上大概就是你项目里能用到的。这些估计能帮助到你了。还有一个就是在你项目里可能会遇到一些调度线程类,会用到service,这时候你非要给他注入对象,会一直拿不到。具体什么原因。不是太明白。或许过几天就能想起来。这时候你可以仿照这个,去做个代理类,让代理类去拿注入这些service,然后你的这个代理类在配置文件里配置一下,记得这个好像是只能在配置文件,然后你写个工具类去拿配置文件里的对象,然后转型。去做你的业务操作,这样你的事务还是不会影响。改天有时间会将那篇也给发布上去吧。反正具体的还是自己去钻研,查阅资料。
下面把之前那个连接给你发了,就是我参考的资源,地址不见了,就把他的文件内容给你发下面做参考吧,你听不懂我说的,可以参照他的,它的简单做个实现。你应该能解决你项目的问题了
具体的相关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(); } }
相关文章推荐
- 项目中碰到的一些比较经典的业务逻辑案例,不定时更新
- [置顶] 对AFN 进行进一步封装,再应用于具体的项目,这样可以将业务逻辑代码与网络框架进行解耦
- 用Spring管理的项目,在不启动服务的情况下进行测试类测试:@RunWith @ContextConfiguration
- 用Spring管理的项目,在不启动服务的情况下进行测试类测试:@RunWith @ContextConfiguration
- Ruby on Rails创建项目和服务启动中的一些问题
- Lync 项目经验-23-要远程登录,你需要具有通过远程桌面服务进行登录的权限
- 如何在项目启动的时候做一些业务处理 (实现ServletContextListener)
- 你需要的不是重构,而是理清业务逻辑(转)
- windows下一些启动服务的命令
- 典型的Linux系统启动需要完成的服务
- 如何顺畅地进行成本核算与业务结算?(上)(野生项目笔记03)
- 最近进行项目开发积累的一些编程经验
- 向Ria service 的 DomainService域服务中添加业务逻辑时的各种标签
- Windows Server 2012 远程桌面,你需要具有通过远程桌面服务进行登录的权限
- 有些应用软件进行系统调用时,为了一些场景更好的实现最优的表现,因此需要调整操作系统参数:
- pycharm-社区版启动django项目的服务
- Express 项目创建 并启动服务:
- 服务启动时处理业务,获取Spring Bean
- 入库单的一些业务逻辑
- Windows服务启动时,如何与UI进行交互