JMS с пружинной загрузкой, отправителем и получателем в одном пакете: для чего он нужен? - PullRequest
0 голосов
/ 04 октября 2018

Я учусь JMS с весенней загрузкой и приятно знать, что весенняя загрузка поставляется с встраиваемым JMS-брокером Active MQ.

Я начал с весенней страницы о том, как этого добиться, и это работает как шарм.Теперь я пошел немного дальше и создал два отдельных приложения с загрузочной пружиной, одно из которых содержало код отправителя jms, а другое - код получателя.

Я попытался запустить, и приложение не удалось, так как оба приложения используют один и тот же порт для JMS.Я исправил это, включив это в одно приложение

@Bean
      public BrokerService broker() throws Exception {
          final BrokerService broker = new BrokerService();
          broker.addConnector("tcp://localhost:61616");
          broker.addConnector("vm://localhost");
          broker.setPersistent(false);
          return broker;
      }

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

Если вы хотите использовать JMS в рабочей среде, было бы намного разумнее избегать использования встроенных в JMS-брокеры Spring Boot и размещать их отдельно.Поэтому для PROD предпочтительнее 3 узла.

Итак, у меня следующие вопросы: 1. Какова цель установки отправителя и получателя jms в одном приложении?Есть ли практический пример 2. Разве не возможно использовать встроенную в JMS пружинную загрузку для связи двух отдельных приложений.

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете иметь отправителя и получателя в одном приложении, если запросы приходят пакетами, и вы хотите сохранить их где-то до их обработки в случае сбоя сервера.Как правило, вы все равно не будете использовать встроенный брокер для этого.

Встроенные брокеры обычно используются только для тестирования.

Однако вы можете запустить встроенный брокер, который доступен извне;просто запустите BrokerService, как у вас, но другое приложение должно соединиться с адресом tcp://..., а не vm://....

РЕДАКТИРОВАТЬ

Приложение 1:

@SpringBootApplication
@RestController
public class So52654109Application {

    public static void main(String[] args) {
        SpringApplication.run(So52654109Application.class, args);
    }

    @Bean
    public BrokerService broker() throws Exception {
        final BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.setPersistent(false);
        broker.start();
        return broker;
    }

    @Autowired
    private JmsTemplate template;

    @RequestMapping(path = "/foo/{id}")
    public String foo(@PathVariable String id) {
        template.convertAndSend("someQueue", id);
        return id + ": thank you for your request, we'll send an email to the address on file when complete";
    }

}

Приложение 2:

application.properties

spring.activemq.broker-url=tcp://localhost:61616

и

@SpringBootApplication
public class So526541091Application {

    public static void main(String[] args) {
        SpringApplication.run(So526541091Application.class, args);
    }

    @JmsListener(destination = "someQueue")
    public void process(String id) {
        System.out.println("Processing request for id");
    }

}

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

Однако, поскольку в этой конфигурации нет постоянных сообщений, вы, скорее всего, будете использовать внешнего посредника для производственного приложения (или включить постоянство).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...