Spring MVC: Как получать обновления в режиме реального времени с устройства с другим IP-адресом? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть пружинное соединение MVC, которое должно получать и отправлять сообщения.Приложение подключено к нашему каналу передачи данных (192.168.13. *)

У меня есть SMS-шлюз с нашими собственными сим-картами под названием Yeastar TG800.Шлюз подключен к нашему IP-соединению (192.168.16. *).

Приложение подключается к шлюзу с помощью ssh и использует опрос для получения сообщений и сохранения их в базе данных приложения, если сообщение еще не сохранено.

Я не знаю, еслив моем сценарии полезно использовать опрос, время от времени я получаю следующие ошибки:

  1. com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset

  2. com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out

  3. com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect

Иногда эти ошибки не появляются, и соединение и опрос успешны, но проблема в том, что эти ошибки появляются больше, чемэто успешно.

Вот решения, которые я попробовал:

  1. Пинговать шлюз

    • нет потери соединения
  2. Подключение с помощью шпатлевки

    • Я могу подключиться
  3. Разрешить порт 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, который вызывает эту ошибку, потому что он постоянно подключается к шлюзу.

Что я должен сделать, чтобы получать обновления в реальном времени от шлюза?Я не могу позволить пользователям использовать это приложение, если оно ненадежно.Это работает, но не так хорошо.Я надеюсь, что вы, ребята, могли бы помочь мне.

...