我有一个Java打印应用程序,它使用原始TCP套接字将票证打印到网络打印机。此应用程序是REST侦听器,当它接收到命令时,将使用与单个以太网热敏打印机的单个连接进行打印。
这是我的单例服务使用的代码:
public class TcpPrinterWrapper implements PrinterWrapper {
private static Logger log = LoggerFactory.getLogger(TcpPrinterWrapper.class);
private PrinterOpzioni opzioni;
private TcpWrapper wrapper;
public TcpPrinterWrapper(PrinterOpzioni opzioni) {
super();
this.opzioni = opzioni;
wrapper=new TcpWrapper();
}
@Override
protected void finalize() throws Throwable {
if(wrapper!=null) try{wrapper.close();}catch (Exception e) {}
super.finalize();
}
private void openPort(){
try {
if(wrapper==null)
wrapper=new TcpWrapper();
wrapper.openPort(opzioni, opzioni.getTcpTimeout());
} catch (Exception e) {
log.error("Errore apertura porta",e);
throw new HardwareException("Porta stampante non valida o non disponibile");
}
}
@Override
public synchronized void print(byte[] content, boolean close) throws Exception {
try{
if(wrapper==null || !wrapper.isOpened()){
openPort();
}
wrapper.write(content);
if(close)
close();
}catch(Exception e){
try{
wrapper.close();
}catch(Exception e1){}
throw e;
}
}
@Override
public void close(){
try {
wrapper.close();
wrapper=null;
} catch (Exception e) {}
}
}
我的问题是:是否应在每次打印结束时关闭其插槽
工作?还是可以将TCP套接字保持打开状态以等待工作几个小时?
我不知道REST请求的频率,但是我确定它们可以等待多个小时,但在一分钟内也会被称为很多。这就是为什么我无法回答的问题,插座可以保持打开状态这么长时间吗?另一方面,我可以在几分钟内打开/关闭/打开/关闭许多插座吗?我应该使断开计时器复杂化吗?
最佳答案
您没有使用原始套接字(使用现有Java的网络标准包是不可能的;您需要在JNI的帮助下使用本机调用来利用原始套接字)。
您在代码中使用的似乎是具有TCPSocket的PrintServer,该TCPSocket是从Java标准包的TCP套接字扩展而来的。而且,有太多的代码尚未共享。
我的问题是:是否应在每次打印结束时关闭其插槽
工作?还是可以将TCP套接字保持打开状态以等待工作几个小时?
理想情况下,每个应用程序应具有进程超时,或在一定时间后释放资源。在等待请求的情况下关闭会话是安全性(以及最佳做法)的一般原则。通过过程,我的意思是基础资源(如果未使用)应该关闭连接或/并给出超时(取决于应用程序的用例)。
因此,是的,如果类TcpWrapper
扩展了类Socket,则应设置连接超时以及读取超时。最重要的是:“一旦完成操作,就应该在客户端和服务器端都关闭Socket”。
您可以使用套接字池来管理打印应用程序的多个连接,如Manage Client Socket Pool中所述。