【发布时间】:2018-07-02 16:33:16
【问题描述】:
我有一个 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 请求的频率,但我确信他们可以等待很多小时,但也可以在一分钟内调用很多。这就是为什么我不能回答,一个套接字可以保持打开等待这么久吗?另一方面,我可以在几分钟内打开/关闭/打开/关闭许多套接字吗?我应该使断开连接计时器复杂化吗?
【问题讨论】:
-
是否应该在每个打印作业结束时关闭其套接字? - 是否正在建立多个套接字连接,或者,它是否只是一个继续提供打印的连接工作?
-
现在我只有一个连接,但我不能说是应该在每次打印作业后关闭它还是只关闭进程。
-
投反对票的人能否给出理由?
-
@Tobia - 我还不清楚。如果您只有一个连接,那么如何在不影响进程的情况下关闭它?您能否进一步澄清一下流程(在您的上下文中)是什么意思?
-
@Am_I_Helpful 我重写了这个问题,如果现在清楚了,请告诉我。谢谢
标签: java performance sockets network-programming tcpclient