Skip to content

Commit

Permalink
Backup
Browse files Browse the repository at this point in the history
  • Loading branch information
XyL1GaN4eG committed Jul 27, 2024
1 parent e6c84fd commit 91bad55
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 66 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
package weatherproject.tgbotservice.clients;

import jakarta.annotation.PostConstruct;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedReader;
import java.io.IOException;
Expand All @@ -21,12 +16,6 @@
@Service
public class GoogleTranslateClient {

@Value("${translate_script.api}")
private String apiKey;

@Autowired
private RestTemplate restTemplate;

private boolean isRussian(String text) {
return text.matches("[а-яА-ЯёЁ\\s]+");
}
Expand Down Expand Up @@ -54,22 +43,26 @@ public String translateRuToEng(String text) {

private String translateFromTo(String langFrom, String langTo, String text) {
try {
String urlStr = "https://script.google.com/macros/s/{apiKey}/exec"
.replace("{apiKey}", apiKey) +
String urlStr = "https://script.google.com/macros/s/AKfycbzO8nojwkOWKi3DjljSEf8byUYIwzNHIIhSRcPn4lGkE_1-m_LuqwU1s5SLJ0TRiarj/exec" +
"?q=" + URLEncoder.encode(text, "UTF-8") +
"&target=" + langTo +
"&source=" + langFrom;

URL url = new URL(urlStr);
log.info("Переводим слово {} с {} на {}", text, langFrom, langTo);
log.info("Сформировали следующий API запрос: {}", urlStr);

ResponseEntity<String> responseEntity = restTemplate.getForEntity(urlStr, String.class);
String translatedWord = responseEntity.getBody();

log.info("Слово {} переведено: {}", text, translatedWord);
StringBuilder response = new StringBuilder();
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("User-Agent", "Mozilla/5.0");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
var translatedWord = response.toString();
log.info("Слово {} переведено: {}", text, response);
return translatedWord;
} catch (Exception e) {
log.error("Произошла ошибка при переводе с {} на {} следующего текста: {}. Подробности: {}", langFrom, langTo, text, e.getMessage());
} catch (IOException e) {
log.error("Произошла ошибка при переводе с {} на {} следующего текста: {}. Подробности: {}", langFrom, langTo, text, e.getMessage());
return "null";
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package weatherproject.weatherapiservice.listener;

import lombok.extern.slf4j.Slf4j;
import org.postgresql.PGNotification;
import org.slf4j.Logger;
import org.springframework.amqp.core.Queue;
Expand All @@ -15,14 +14,23 @@
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
//TODO: разобраться как работает и сделать чуть красивее

@Component
@Slf4j
public class TemperatureChangeNotifier {
private final RabbitTemplate rabbitTemplate;

private static final Logger log = org.slf4j.LoggerFactory.getLogger(TemperatureChangeNotifier.class);

// Автоматически подставляемый DataSource, который настроен в конфигурации Spring
private final DataSource dataSource;

private final Queue notificationQueue;

// Переменная для хранения соединения с базой данных
private Connection connection;

// Поток, в котором будет выполняться прослушивание уведомлений
private Thread listenerThread;

@Autowired
Expand All @@ -35,14 +43,43 @@ public TemperatureChangeNotifier(RabbitTemplate rabbitTemplate, RabbitMQConfig r
@PostConstruct
public void init() {
log.info("TemperatureChangeNotifier инициализирован");
startListening();
}

private void startListening() {
// Метод, который будет выполнен после создания бина (инициализация)
@PostConstruct
public void start() {
// Создаем и запускаем новый поток для прослушивания уведомлений
listenerThread = new Thread(() -> {
log.info("TemperatureChangeNotifier начал поток");
try {
initializeConnection();
listenForNotifications();
log.info("Получаем соединение в бд");
connection = dataSource.getConnection();
log.info("Создаем SQL-запрос для подписки на уведомления");
connection.createStatement().execute("LISTEN my_notification");

log.info("Начинаем бесконечный цикл для постоянного прослушивания");
while (!Thread.currentThread().isInterrupted()) {
try (Statement stmt = connection.createStatement()) {
log.info("Повторно создаем SQL-запрос для подписки на уведомления");
stmt.execute("LISTEN my_notification");

// Проверяем наличие новых уведомлений с таймаутом в 5000 мс
PGNotification[] notifications = connection.unwrap(org.postgresql.PGConnection.class).getNotifications(5000);

for (PGNotification notification : notifications) {
// Обработка уведомлений (тут можно добавить вашу логику)
if (notification != null) {
log.info("Получено уведомление от триггера с бд: {}", notification);
rabbitTemplate.convertAndSend(notificationQueue.getName(), notification.getParameter());
} else {
log.info("Уведомления нет или массив уведомлений пуст");
}
}
} catch (SQLException e) {
// Выводим сообщение об ошибке в консоль
log.error("Произошла ошибка во время прослушивания уведомлений: {}", e.getMessage());
}
}
} catch (SQLException e) {
log.error("Исключение при установке соединения: {}", e.getMessage());
}
Expand All @@ -51,50 +88,15 @@ private void startListening() {
listenerThread.start();
}

private void initializeConnection() throws SQLException {
log.info("Получаем соединение в бд");
connection = dataSource.getConnection();
log.info("Создаем SQL-запрос для подписки на уведомления");
connection.createStatement().execute("LISTEN my_notification");
}

private void listenForNotifications() {
log.info("Начинаем бесконечный цикл для постоянного прослушивания");
while (!Thread.currentThread().isInterrupted()) {
try (Statement stmt = connection.createStatement()) {
stmt.execute("LISTEN my_notification");

PGNotification[] notifications = connection.unwrap(org.postgresql.PGConnection.class).getNotifications(5000);
processNotifications(notifications);
} catch (SQLException e) {
log.error("Произошла ошибка во время прослушивания уведомлений: {}", e.getMessage());
}
}
}

private void processNotifications(PGNotification[] notifications) {
if (notifications != null) {
for (PGNotification notification : notifications) {
if (notification != null) {
log.info("Получено уведомление от триггера с бд: {}", notification);
rabbitTemplate.convertAndSend(notificationQueue.getName(), notification.getParameter());
} else {
log.info("Уведомления нет или массив уведомлений пуст");
}
}
}
}

// Метод, который будет выполнен перед уничтожением бина (очистка ресурсов)
@PreDestroy
public void stop() {
// Прерываем поток, если он активен
if (listenerThread != null && listenerThread.isAlive()) {
log.info("Прерываем поток для TemperatureChangeNotifier");
listenerThread.interrupt();
}
closeConnection();
}

private void closeConnection() {
// Закрываем соединение с базой данных, если оно открыто
if (connection != null) {
log.info("Закрываем соединение прослушивателя триггера с бд");
try {
Expand Down

0 comments on commit 91bad55

Please sign in to comment.