我在web.xml中配置了几行参数,代码如下(servlet-mapping省略): <servlet>
<servlet-name>old</servlet-name>
<servlet-class>com.xxx.servlet.Old</servlet-class>
<init-param>
<param-name>old</param-name>
<param-value>8888</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>在servlet程序里是这样写的: public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println(config.getInitParameter("old"));
try {
new startServer().startOldTCPServer();
} catch (IOException e) {
e.printStackTrace();
}
}这个“old”字符串8888是可以在控制台输出的,而且控制台只输出到“8888”。问题是处在“new startServer().startOldTCPServer();”这步就不向下进行了。因为里面是一个循环,代码如下: public void startOldTCPServer() throws IOException {
ServerSocket server = new ServerSocket(port);
oldServer = true;
while (true) {
// transfer location change Single User or Multi User
OldDao goldControlDao = new OldDao(server.accept());
goldControlDao.start();
}
}不向下进行,那么tomcat也就没有“Service startup in XXX ms”。没有这个也就无法访问我的网站。那么现在的需求是在tomcat启动时(或者启动后),自动调用startOldTCPServer()方法,而不是手工请求servlet来调用startOldTCPServer()方法。而且,我还有一段代码是startNewTCPServer(),里面同样是一个循环。
请问这种问题用什么可以解决?
我初步的解决方案是使用一个timer。再用个数组,数组里放的是我需要调用的方法名称。假设我现在有两个方法需要调用,那么我让timer循环两次,一次取出两个方法名称,通过反射机制调用OldDao类的startOldTCPServer方法,同理调用startNewTCPServer方法。不知这样是否可以。当timer循环到第三次时,直接cancel掉,这时候tomcat就应该向下执行了吧。当然,即使可行,我这个也是最笨的方法,请各位大虾帮忙,谢谢了!
<servlet-name>old</servlet-name>
<servlet-class>com.xxx.servlet.Old</servlet-class>
<init-param>
<param-name>old</param-name>
<param-value>8888</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>在servlet程序里是这样写的: public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println(config.getInitParameter("old"));
try {
new startServer().startOldTCPServer();
} catch (IOException e) {
e.printStackTrace();
}
}这个“old”字符串8888是可以在控制台输出的,而且控制台只输出到“8888”。问题是处在“new startServer().startOldTCPServer();”这步就不向下进行了。因为里面是一个循环,代码如下: public void startOldTCPServer() throws IOException {
ServerSocket server = new ServerSocket(port);
oldServer = true;
while (true) {
// transfer location change Single User or Multi User
OldDao goldControlDao = new OldDao(server.accept());
goldControlDao.start();
}
}不向下进行,那么tomcat也就没有“Service startup in XXX ms”。没有这个也就无法访问我的网站。那么现在的需求是在tomcat启动时(或者启动后),自动调用startOldTCPServer()方法,而不是手工请求servlet来调用startOldTCPServer()方法。而且,我还有一段代码是startNewTCPServer(),里面同样是一个循环。
请问这种问题用什么可以解决?
我初步的解决方案是使用一个timer。再用个数组,数组里放的是我需要调用的方法名称。假设我现在有两个方法需要调用,那么我让timer循环两次,一次取出两个方法名称,通过反射机制调用OldDao类的startOldTCPServer方法,同理调用startNewTCPServer方法。不知这样是否可以。当timer循环到第三次时,直接cancel掉,这时候tomcat就应该向下执行了吧。当然,即使可行,我这个也是最笨的方法,请各位大虾帮忙,谢谢了!
解决方案 »
- Eclipse、JBoss、SQL2005 开发EJB3.0 但连接不上数据库请高手指点
- javascript取后台值,以及xmlhttp:open方法中的POST、GET参数的区别
- hibernate新手求助!!
- weblogic10 数据源配置
- java 中keytool生成密钥
- HelloWorld 的问题
- 能推荐一本hibernate入门的书吗?
- 在Console里创建了connect poll有什么用???
- 请问如何在servlet中调用另一台机器上的ejb对象?
- 要死人了,部署J2EE时出现了....
- Spring和hibernate+sql整合出现的问题
- 用过LazyValidatorForm的朋友帮忙,使用 LazyValidatorForm 验证多文件上载异常。
搜一下就有了
首先要确定你方法没问题
方法没问题,过那个循环是为了同时接收多个socket请求而写的,网上也只有这个方法。主要问题就是那个循环。不知你是否明白我的话
看了一下你的代码,应该是想在加载servlet的时候就启动socket监听,来完成socket通讯。 但是在init初始化的时候出现死循环,所以一直无法init成功。 感觉用过滤器好像也不行,建议使用线程处理,在init方法中调用一个线程,线程中去启动socket监听, 这样的话init应该会继续往下走,能够初始化成功!
嗯,确实是这个问题。用线程,我也想过,不过单用“.start()”还要卡在那个while里面。真是伤脑筋啊……
你可以先写好线程类,在init方法中调,start()方法调用以后,在run()方法中写while启动监听不就可以了么?start()以后,什么时候启动线程由CPU来决定,你的应用程序可以继续往下走,while在现场中run()方法中再用就可以啊 ----有分了,给点分,我穷人啊 :)