为了账号安全,请及时绑定邮箱和手机立即绑定

春季多个imapAdapter

/ 猿问

春季多个imapAdapter

繁星coding 2019-10-22 21:24:45

我是Spring的新手,我不喜欢代码重复。我写了一个工作正常的ImapAdapter:


@Component

public class GeneralImapAdapter {


    private Logger logger = LoggerFactory.getLogger(getClass());


    @Autowired

    private EmailReceiverService emailReceiverService;


    @Bean

    @InboundChannelAdapter(value = "emailChannel", poller = @Poller(fixedDelay = "10000", taskExecutor = "asyncTaskExecutor"))

    public MessageSource<javax.mail.Message> mailMessageSource(MailReceiver imapMailReceiver) {

        return new MailReceivingMessageSource(imapMailReceiver);

    }


    @Bean

    @Value("imaps://<login>:<pass>@<url>:993/inbox")

    public MailReceiver imapMailReceiver(String imapUrl) {

        ImapMailReceiver imapMailReceiver = new ImapMailReceiver(imapUrl);

        imapMailReceiver.setShouldMarkMessagesAsRead(true);

        imapMailReceiver.setShouldDeleteMessages(false);

        // other setters here

        return imapMailReceiver;

    }


    @ServiceActivator(inputChannel = "emailChannel",  poller = @Poller(fixedDelay = "10000", taskExecutor = "asyncTaskExecutor"))

    public void emailMessageSource(javax.mail.Message message) {

        emailReceiverService.receive(message);

    }

}

但是我想要大约20个这样的适配器,唯一的区别是imapUrl。


没有代码重复怎么办?


查看完整描述

2 回答

?
牛魔王的故事

使用配置了属性的多个应用程序上下文。


这个例子是一个例子。它使用XML进行配置,但是相同的技术也适用于Java配置。


如果您需要他们共同养活emailReceiverService; 使各个适配器上下文成为子上下文;请参阅样本自述文件以获取有关如何进行操作的指针。


编辑:


这是一个示例,其中服务(和渠道)在共享的父上下文中...


@Configuration

@EnableIntegration

public class MultiImapAdapter {


    public static void main(String[] args) throws Exception {

        AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(MultiImapAdapter.class);

        parent.setId("parent");

        String[] urls = { "imap://foo", "imap://bar" };

        List<ConfigurableApplicationContext> children = new ArrayList<ConfigurableApplicationContext>();

        int n = 0;

        for (String url : urls) {

            AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();

            child.setId("child" + ++n);

            children.add(child);

            child.setParent(parent);

            child.register(GeneralImapAdapter.class);

            StandardEnvironment env = new StandardEnvironment();

            Properties props = new Properties();

            // populate properties for this adapter

            props.setProperty("imap.url", url);

            PropertiesPropertySource pps = new PropertiesPropertySource("imapprops", props);

            env.getPropertySources().addLast(pps);

            child.setEnvironment(env);

            child.refresh();

        }

        System.out.println("Hit enter to terminate");

        System.in.read();

        for (ConfigurableApplicationContext child : children) {

            child.close();

        }

        parent.close();

    }


    @Bean

    public MessageChannel emailChannel() {

        return new DirectChannel();

    }


    @Bean

    public EmailReceiverService emailReceiverService() {

        return new EmailReceiverService();

    }


}


@Configuration

@EnableIntegration

public class GeneralImapAdapter {


    @Bean

    public static PropertySourcesPlaceholderConfigurer pspc() {

        return new PropertySourcesPlaceholderConfigurer();

    }


    @Bean

    @InboundChannelAdapter(value = "emailChannel", poller = @Poller(fixedDelay = "10000") )

    public MessageSource<javax.mail.Message> mailMessageSource(MailReceiver imapMailReceiver) {

        return new MailReceivingMessageSource(imapMailReceiver);

    }


    @Bean

    @Value("${imap.url}")

    public MailReceiver imapMailReceiver(String imapUrl) {

//      ImapMailReceiver imapMailReceiver = new ImapMailReceiver(imapUrl);

//      imapMailReceiver.setShouldMarkMessagesAsRead(true);

//      imapMailReceiver.setShouldDeleteMessages(false);

//      // other setters here

//      return imapMailReceiver;

        MailReceiver receiver = mock(MailReceiver.class);

        Message message = mock(Message.class);

        when(message.toString()).thenReturn("Message from " + imapUrl);

        Message[] messages = new Message[] {message};

        try {

            when(receiver.receive()).thenReturn(messages);

        }

        catch (MessagingException e) {

            e.printStackTrace();

        }

        return receiver;

    }


}


@MessageEndpoint

public class EmailReceiverService {


    @ServiceActivator(inputChannel="emailChannel")

    public void handleMessage(javax.mail.Message message) {

        System.out.println(message);

    }


}

希望能有所帮助。


请注意,您不需要服务激活器上的轮询器-使用a DirectChannel,该服务将在轮询器执行器线程上被调用-无需其他异步切换。


查看完整回答
反对 回复 2019-10-22
?
米脂

我并不是在建议您需要动态渠道;我建议您可以使用该示例使用的相同技术,以创建由属性驱动的具有相同配置的多个“ cookie切割器”实例。即AnnotationConfigApplicationContext从您的配置类创建一个新的;在其环境中加载实例的属性,并通过刷新来创建上下文。从而避免代码重复。

查看完整回答
反对 回复 2019-10-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信