Guest User

Untitled

a guest
Oct 26th, 2018
652
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Ориентировочный интерфейс нашего messaging решения.
  3.  */
  4. public interface MessagingService {
  5.  
  6.     /**
  7.      * Отправка сообщения в шину.
  8.      *
  9.      * @param msg сообщение для отправки.
  10.      *
  11.      * @return идентификатор отправленного сообщения (correlationId)
  12.      */
  13.     <T> MessageId send(Message<T> msg);
  14.  
  15.     /**
  16.      * Встает на ожидание ответа по сообщению с messageId.
  17.      *
  18.      * Редко, но может кинуть исключение по таймауту.
  19.      *
  20.      * @param messageId идентификатор сообщения, на которое ждем ответ.
  21.      * @return Тело ответа.
  22.      */
  23.     <T> Message<T> receive(MessageId messageId) throws TimeoutException;
  24.  
  25.     /**
  26.      * Отправляем сообщение и ждем на него ответ.
  27.      *
  28.      * @param request тело запроса.
  29.      * @return тело ответа.
  30.      */
  31.     <R, A> Message<A> doRequest(Message<R> request) throws TimeoutException;
  32. }
  33.  
  34.  
  35.  
  36. /**
  37.  * Ориентировочный интерфейс мейлера.
  38.  */
  39. public interface SendMailer {
  40.     void sendMail (EmailAddress toAddress, EmailContent messageBody) throws TimeoutException;
  41. }
  42.  
  43.  
  44.  
  45. /**
  46.  * Опциональный интерфейс для лисенеров.
  47.  * Необязательно реализовывать всю инфраструктуру по регистрации и обработке, достаточно и тестов.
  48.  *
  49.  * @param <T> тип сообщений, которые будем слушать.
  50.  */
  51. public interface MessageListener<T> {
  52.      void handleMessage(Message<T> incomingMessage);
  53. }
  54.  
  55.  
  56.  
  57. public class MessagingServiceStub implements MessagingService {
  58.  
  59.     @Override
  60.     public <T> MessageId send(Message<T> msg) {
  61.         return new MessageId(UUID.randomUUID());
  62.     }
  63.  
  64.     @Override
  65.     public <T> Message<T> receive(MessageId messageId) throws TimeoutException {
  66.         if(shouldThrowTimeout()) {
  67.             sleep();
  68.  
  69.             throw new TimeoutException("Timeout!");
  70.         }
  71.  
  72.         if(shouldSleep()) {
  73.             sleep();
  74.         }
  75.  
  76.         // return our stub message here.
  77.         return null;
  78.     }
  79.  
  80.     @Override
  81.     public <R, A> Message<A> doRequest(Message<R> request) throws TimeoutException {
  82.         final MessageId messageId = send(request);
  83.  
  84.         return receive(messageId);
  85.     }
  86.  
  87.     @SneakyThrows
  88.     private static void sleep() {
  89.         Thread.sleep(TimeUnit.MINUTES.toMillis(1));
  90.     }
  91.  
  92.  
  93.     private static boolean shouldSleep() {
  94.         return new Random().nextInt(10) == 1;
  95.     }
  96.  
  97.     private static boolean shouldThrowTimeout() {
  98.         return new Random().nextInt(10) == 1;
  99.     }
  100. }
  101.  
  102.  
  103.  
  104. public class SendMailerStub implements SendMailer {
  105.  
  106.     @Override
  107.     public void sendMail(EmailAddress toAddress, EmailContent messageBody) throws TimeoutException {
  108.         if(shouldThrowTimeout()) {
  109.             sleep();
  110.  
  111.             throw new TimeoutException("Timeout!");
  112.         }
  113.  
  114.         if(shouldSleep()) {
  115.             sleep();
  116.         }
  117.  
  118.         // ok.
  119.         log.info("Message sent to {}, body {}.", toAddress, messageBody);
  120.     }
  121.  
  122.     @SneakyThrows
  123.     private static void sleep() {
  124.         Thread.sleep(TimeUnit.MINUTES.toMillis(1));
  125.     }
  126.  
  127.     private static boolean shouldSleep() {
  128.         return new Random().nextInt(10) == 1;
  129.     }
  130.  
  131.     private static boolean shouldThrowTimeout() {
  132.         return new Random().nextInt(10) == 1;
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment