С Mule 3 можно было асинхронно отправлять сообщения на конечную точку с помощью MuleClient:
MuleClient client = new MuleClient(muleContext);
client.dispatch("vm://vm.queue", "Message Payload", null);
Есть ли способ перенести эту функцию в Mule 4, поскольку MuleClient был удален?
Я наткнулся на пост, в котором предлагалось получить поток по имени и опубликовать сообщение в потоке следующим образом
Flow flow = registry.lookupByName("MyFlow").get();
InputEvent event = new DefaultInputEvent();
event.message(Message.of(payload));
flow.execute(event);
но я получаю исключение ClassNotFoundException для класса org.mule.runtime.internal.event.DefaultInputEvent
Желательно через модуль Spring или Java.
Я не пробовал, но нашел это. Возможно, это поможет: Вызов потоков Mule4 из кода Java
Почему вам нужно сделать это из Java? Понимание контекста может помочь найти решение.
Обратите внимание, что в Mule 4 конечные точки не существуют. Метод, которым поделился @HarshankBansal, заключается в запуске потока, а не его слушателя. Также требуется разработать расширение Mule. При использовании модуля Java не рекомендуется использовать API-интерфейсы или типы Mule.
У меня есть DeploymentListener, которому нужно отправлять уведомления при изменении состояния запущенных приложений, а также у меня есть spring bean-компоненты, которым необходимо уведомлять клиентов при выполнении определенных условий.
Я не уверен, что прослушиватель развертывания поддерживается внутри приложения. По крайней мере, они не задокументированы: docs.mulesoft.com/mule-runtime/4.4/mule-server-notifications
Я пытался использовать уведомления, но не смог получить экземплярnotificationDispatcher. В документации не указано, какой это класс и как его получить.
Как я могу заставить эти уведомления запускать поток?
Это был бы другой вопрос.
Используя рекомендацию Харшанка, я смог отправлять сообщения в поток, просто получая ссылку на поток и запуская поток, отправляя сообщения источнику.
Flow flow = registry.lookupByName(flowName).get();
ComponentLocation location = DefaultComponentLocation.from(flowName + "/source");
...
Message message = Message.of(payload);
CoreEvent coreEvent = CoreEvent.builder(EventContextFactory.create(flow, location)).message(message).build();
flow.process(coreEvent);
Это гораздо более чистое решение, чем то, что реализовано в блоге, и работает с bean-компонентами, инициализированными в модуле Spring. Как уже упоминалось, это плохая практика, но в интересах времени это решение.
Вам нужно делать это только через Java? или dataweve будет работать?