Я пытаюсь отправить запрос UDP и получить ответ. В Spring Integration есть подходящие инструменты для решения таких задач: UnicastSendingMessageHandler
и UnicastReceivingChannelAdapter
. Я настроил его следующим образом
@Bean
public MessageChannel requestChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "requestChannel")
public UnicastSendingMessageHandler unicastSendingMessageHandler() {
UnicastSendingMessageHandler unicastSendingMessageHandler = new UnicastSendingMessageHandler("239.255.255.250", 1982);
return unicastSendingMessageHandler;
}
@Bean
public UnicastReceivingChannelAdapter unicastReceivingChannelAdapter() {
UnicastReceivingChannelAdapter unicastReceivingChannelAdapter = new UnicastReceivingChannelAdapter(8080);
unicastReceivingChannelAdapter.setOutputChannelName("nullChannel");
return unicastReceivingChannelAdapter;
}
Как отправить сообщение (я использую sendDiscoveryMessage () , куда я хочу):
@Service
public class DiscoveryService {
private static final String DISCOVERY_MESSAGE = "M-SEARCH * HTTP/1.1\r\n"
+ "HOST: 239.255.255.250:1982\r\n"
+ "MAN: \"ssdp:discover\"\r\n"
+ "ST: wifi_bulb";
private final MessageChannel requestChannel;
public DiscoveryService(final MessageChannel requestChannel) {
this.requestChannel = requestChannel;
}
public void sendDiscoveryMessage() {
requestChannel.send(new GenericMessage<>(DISCOVERY_MESSAGE));
}
}
В В этот момент я могу проверить пакеты через WireShark и убедиться, что было отправлено дейтаграмма и соответствующий ответ. Вопрос только в том, как получить этот ответ. Насколько я понимаю, читая документацию, мне нужен метод, помеченный @ServiceActivator
. Но я не понимаю, где (какой канал) я должен получить ответ (чтобы правильно указать @ServiceActivator(inputChannel="")
). Кроме того, я не уверен насчет @ServiceActivator(inputChannel = "requestChannel")
, который я положил для UnicastSendingMessageHandler
боб. Я попытался создать следующий метод (предполагая, что ответ придет на тот же канал):
@ServiceActivator(inputChannel = "requestChannel")
public void receiveResponse(Message<String> response) {
System.out.println(response);
}
, но на самом деле он перехватывает мое собственное сообщение с запросом (мне кажется логичным, потому что я отправляю запрос на requestChannel ). Поэтому я не понимаю, сколько каналов мне нужно (возможно, мне нужно 1 для запроса и 1 для ответа) и как создать @ServiceActivator
, чтобы перехватить ответ.