2015-04-29 6 views
2

Мне нужно реализовать с помощью библиотек весной-интрагации конвейер сообщений. В начале, как я вижу сейчас, он должен содержать несколько элементов:Найти подходящую пару queue-consumer

a. шлюз сообщений,

@MessagingGateway(name = "entryGateway", defaultRequestChannel = "requestChannel") 
public interface MessageGateway { 
    public boolean processMessage(Message<?> message); 
} 

, который вызывается, когда я хочу, чтобы запустить трубопровод:

messageGateway.processMessage(message); 

б. Канал для передачи сообщений:

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

c.Router который определяет то, где поток сообщений

@MessageEndpoint 
@Component 
public class MessageTypeRouter { 
    Logger log = Logger.getLogger(MessageTypeRouter.class); 

    @Router(inputChannel="requestChannel") 
    public String processMessageByPayload(Message<?> message){...} 

Там может быть много входящих сообщений в небольшой период времени, поэтому я хотел бы реализовать канал (б) в качестве QueueChannel:

@Bean 
public MessageChannel requestChannel() { 
     return new QueueChannel(); 
} 

с другой стороны, я хотел бы маршрутизатор, чтобы начать, как только приходит сообщение через шлюз и другие сообщения ждать в очереди. Но в этом случае я получил ошибку, в которой говорилось, что я должен был использовать poller.

Может быть, вы могли бы дать мне совет, как я могу реализовать свою схему. Заранее спасибо.

ответ

0

Как известно, с конфигурацией XML мы должны объявить компонент <poller> и пометить его default="true". Это позволяет любому оконечному устройству PollingConsumer забрать default Poller из контекста.

С Java конфигурации мы должны объявить @Bean для подобной цели:

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata defaultPoller() { 
    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(new PeriodicTrigger(10)); 
    return pollerMetadata; 
} 

Если PollerMetadata.DEFAULT_POLLER специфичен константа для определения default Poller. Хотя одно и то же имя используется из конфигурации XML в случае default="true".

С другой стороны @Router annotation имеет атрибут poller, чтобы указать что-то подобное, как мы делаем с вложенными <poller> в формате XML.

+0

Как вы можете видеть, я не хочу использовать семантику опроса. Я использую управляемый сообщениями шлюз, который на самом деле не совместим с queueChannel, как я читал. Возникает вопрос: как я могу хранить несколько входящих сообщений, используя семантику, управляемую сообщениями. – user2957954

+0

OK. Как насчет «ExecutorChannel»? Любое входящее сообщение будет ожидать, что бесплатный 'Thread' будет обработан во внутренней' queue' 'ThreadPollTaskExecutor' –

+0

Это мой pipleline: gateway -> channel -> Router -> дальше. Мне нужно реализовать Router и другие как Runnable, если я хочу выполнить userChannel, не так ли? – user2957954

Смежные вопросы