2016-12-15 9 views
1

Я собираюсь перенести проект, созданный с помощью старой версии Spring (с использованием конфигурации XML) в Spring Boot (с использованием конфигурации Java). Проект использует Spring Integration для связи через JMS и AMQP. Насколько я понял, я должен заменитьАннотации «@MessagingGateway» Springs на внешних интерфейсах

<int:gateway id="someID" service-interface="MyMessageGateway" 
default-request-channel="myRequestChannel" 
default-reply-channel="myResponseChannel" 
default-reply-timeout="20000" /> 

с

@MessagingGateway(name="someID", defaultRequestChannel = "myRequestChannel", 
defaultReplyChannel = "myResponseChannel", defaultReplyTimeout = "20000") 
public interface MyMessageGateway{ ...... } 

Моя проблема в том, что интерфейс, который используется в настоящее время, находится в библиотеке, я не могу получить доступ ,

Как я могу определить этот интерфейс как свой MessagingGateway?

Заранее благодарен!

+0

Вы не должны ничего делать ... Вы все еще можете использовать конфигурацию XML, вы не должны перенести все в конфигурации Java на основе , –

+0

Правильно, для Spring Boot это не нужно. Но отдел хочет переключиться на конфигурацию на основе Java. :) – NagelAufnKopp

ответ

0

Я только что проверил этот трюк:

interface IControlBusGateway { 

    void send(String command); 
} 

@MessagingGateway(defaultRequestChannel = "controlBus") 
interface ControlBusGateway extends IControlBusGateway { 

} 

... 


@Autowired 
private IControlBusGateway controlBus; 

... 

try { 
     this.bridgeFlow2Input.send(message); 
     fail("Expected MessageDispatchingException"); 
    } 
    catch (Exception e) { 
     assertThat(e, instanceOf(MessageDeliveryException.class)); 
     assertThat(e.getCause(), instanceOf(MessageDispatchingException.class)); 
     assertThat(e.getMessage(), containsString("Dispatcher has no subscribers")); 
    } 
    this.controlBus.send("@bridge.start()"); 
    this.bridgeFlow2Input.send(message); 
    reply = this.bridgeFlow2Output.receive(5000); 
    assertNotNull(reply); 

Другими словами, вы можете просто extends, что внешний интерфейс для вашей локальной. GatewayProxyFactoryBean сделает магию прокси для вас внизу.

Также мы имеем это JIRA для подобного сценария использования: https://jira.spring.io/browse/INT-4134

+0

Это сделало трюк! Так мало и просто. :) Благодаря! – NagelAufnKopp

0

Использовать GatewayProxyFactoryBean; Вот простой пример:

@SpringBootApplication 
public class So41162166Application { 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(So41162166Application.class, args); 
     context.getBean(NoAnnotationsAllowed.class).foo("foo"); 
     context.close(); 
    } 

    @Bean 
    public GatewayProxyFactoryBean gateway() { 
     GatewayProxyFactoryBean gateway = new GatewayProxyFactoryBean(NoAnnotationsAllowed.class); 
     gateway.setDefaultRequestChannel(channel()); 
     return gateway; 
    } 

    @Bean 
    public MessageChannel channel() { 
     return new DirectChannel(); 
    } 

    @ServiceActivator(inputChannel = "channel") 
    public void out(String foo) { 
     System.out.println(foo); 
    } 

    public static interface NoAnnotationsAllowed { 

     public void foo(String out); 

    } 

}