У меня есть пружинное соединение MVC, которое должно получать и отправлять сообщения.Приложение подключено к нашему каналу передачи данных (192.168.13. *)
У меня есть SMS-шлюз с нашими собственными сим-картами под названием Yeastar TG800.Шлюз подключен к нашему IP-соединению (192.168.16. *).
Приложение подключается к шлюзу с помощью ssh и использует опрос для получения сообщений и сохранения их в базе данных приложения, если сообщение еще не сохранено.
Я не знаю, еслив моем сценарии полезно использовать опрос, время от времени я получаю следующие ошибки:
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out
com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
Иногда эти ошибки не появляются, и соединение и опрос успешны, но проблема в том, что эти ошибки появляются больше, чемэто успешно.
Вот решения, которые я попробовал:
Пинговать шлюз
Подключение с помощью шпатлевки
Разрешить порт SSH в брандмауэре
Подключение к SMS-шлюзу через SSH
private String getSmsDump() {
StringBuilder sb = new StringBuilder();
try {
String command = "sqlite3 /persistent/var/lib/asterisk/db/MyPBX.sqlite \".read /persistent/script/cwms/smsrecv_html.sqlc\"";
String host = this.sshHost;
String user = this.sshUser;
String password = this.sshPassword;
int port = this.sshPort;
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream input = channel.getInputStream();
channel.connect();
try {
InputStreamReader inputReader = new InputStreamReader(input);
BufferedReader bufferedReader = new BufferedReader(inputReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
sb.append(System.getProperty("line.separator"));
}
bufferedReader.close();
inputReader.close();
} catch (Exception ex) {
LOGGER.error("BUFFERED READER ERROR: "+ex);
}
channel.disconnect();
session.disconnect();
} catch (JSchException | IOException ex) {
LOGGER.error("SSH CONNECTION ERROR: "+ex);
}
return sb.toString();
} // end getSmsHtmlDump()
Опрос сообщений
@Service("smspoller")
@PropertySource("file:${config.home}\\cwms.properties")
public class SmsPoller {
private static final Logger LOGGER = Logger.getLogger(SmsServiceImpl.class);
@Autowired
private SmsMapper smsMapper;
@Value("${cwms.sms-gateway.ssh-host}")
private String sshHost;
@Value("${cwms.sms-gateway.ssh-user}")
private String sshUser;
@Value("${cwms.sms-gateway.ssh-password}")
private String sshPassword;
@Value("${cwms.sms-gateway.ssh-port}")
private int sshPort;
protected void poll() {
LOGGER.debug("### GETTING SMS MESSAGES FROM GATEWAY ###");
TG800Connector smsGateway = new TG800Connector(sshHost, sshUser, sshPassword, sshPort);
List<SmsMessage> smsList = smsGateway.getSmsMessages();
List<SmsMessage> smsSendList = smsGateway.getSmsSendMessages();
LOGGER.debug("############### GETING SMS MESSAGES FROM GATEWAY #####################");
try {
smsMapper.insertSmsListTest(smsList);
smsMapper.insertSmsSendList(smsSendList);
LOGGER.debug("############# STORING OF MESSAGES TO DATABASE SUCCESSFULL ################");
}catch(Exception e) {
LOGGER.debug("################ Storing Failed! ######################" + e);
}
}
}
@Configuration
@ComponentScan("com.beneco.cwms.job")
public class QuartzConfiguration {
@Bean
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
MethodInvokingJobDetailFactoryBean obj = new MethodInvokingJobDetailFactoryBean();
obj.setTargetBeanName("smspoller");
obj.setTargetMethod("poll");
System.out.println("###################################### REGISTERED QuartzConfiguration:methodInvokingJobDetailFactoryBean");
return obj;
}
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();
stFactory.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
stFactory.setStartDelay(3000);
stFactory.setRepeatInterval(2000);
System.out.println("###################################### REGISTERED QuartzConfiguration:simpleTriggerFactoryBean");
return stFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
scheduler.setTriggers(simpleTriggerFactoryBean().getObject());
System.out.println("###################################### REGISTERED QuartzConfiguration:schedulerFactoryBean");
return scheduler;
}
}
Не знаю, если это поlling, который вызывает эту ошибку, потому что он постоянно подключается к шлюзу.
Что я должен сделать, чтобы получать обновления в реальном времени от шлюза?Я не могу позволить пользователям использовать это приложение, если оно ненадежно.Это работает, но не так хорошо.Я надеюсь, что вы, ребята, могли бы помочь мне.