Spring Integration Mail - преобразование XML в конфигурацию Java
Я новичок в Spring Framework, и у меня возникли проблемы с преобразованием *.xml в Java Config. Я не знаю, как мне заменить эту строку:
<int:channel id="emails"/>
Вы можете увидеть мои файлы ниже
XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-mail="http://www.springframework.org/schema/integration/mail"
xmlns:util="http://www.springframework.org/schema/util">
<int:channel id="emails"/>
<util:properties id="javaMailProperties">
<prop key="mail.imap.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
<prop key="mail.imap.socketFactory.fallback">false</prop>
<prop key="mail.store.protocol">imaps</prop>
<prop key="mail.debug">true</prop>
</util:properties>
<int-mail:imap-idle-channel-adapter id="mailAdapter"
store-uri="imaps://login:pass@imap-server:993/INBOX"
java-mail-properties="javaMailProperties"
channel="emails"
should-delete-messages="false"
should-mark-messages-as-read="true">
</int-mail:imap-idle-channel-adapter>
</beans>
Java Config, который я уже создал:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.mail.ImapIdleChannelAdapter;
import org.springframework.integration.mail.ImapMailReceiver;
import java.util.Properties;
@Configuration
class ImapConfiguration {
private Properties javaMailProperties() {
Properties javaMailProperties = new Properties();
javaMailProperties.setProperty("mail.imap.socketFactory.class","javax.net.ssl.SSLSocketFactory");
javaMailProperties.setProperty("mail.imap.socketFactory.fallback","false");
javaMailProperties.setProperty("mail.store.protocol","imaps");
javaMailProperties.setProperty("mail.debug","true");
return javaMailProperties;
}
@Bean
ImapIdleChannelAdapter mailAdapter() {
ImapMailReceiver mailReceiver = new ImapMailReceiver("imaps://login:pass@imap-server:993/INBOX");
mailReceiver.setJavaMailProperties(javaMailProperties());
mailReceiver.setShouldDeleteMessages(false);
mailReceiver.setShouldMarkMessagesAsRead(true);
return new ImapIdleChannelAdapter(mailReceiver);
}
}
4 ответа
Я не знаю, как мне заменить эту строку:
<int:channel id="emails"/>
Просто к
@Bean
public MessageChannel emails() {
return new DirectChannel();
}
Пожалуйста, прочитайте Справочное руководство для получения дополнительной информации и ознакомьтесь с примерами проекта.
И да, не забывай @EnableIntegration
для некоторых из ваших @Configuration
классы: http://docs.spring.io/spring-integration/reference/html/overview.html
Это зависит от желаемого канала, но в основном это применимо
@Bean
public PollableChannel defaultChannel() {
return new QueueChannel(10);
}
@Bean
public SubscribableChannel subscribeChannel() {
return new PublishSubscribeChannel();
}
Это полностью зависит от того, какой тип каналов сообщений вы используете
Если вы используете двухточечное соединение с каналом, то вам подойдут DirectChannel и NullChannel. Для канала публикации-подписки используйте PublishSubscribeChannel, QueueChannel, PriorityChannel, RendezvousChannel, ExecutorChannel и ScopedChannel.
Я бы посоветовал вам вернуться и проверить, как вы это сделали
applicationcontext.getBean("emails",DirectChannel.class)
затем добавьте
@Bean
public DirectChannel defaultChannel() {
return new DirectChannel();
}
Вот весь класс конфигурации Java.
import java.util.Properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mail.ImapIdleChannelAdapter;
import org.springframework.integration.mail.ImapMailReceiver;
@Configuration
public class IMAPIdleConfiguration {
@Value("${imap.mailReceiverURL}")
private String imapMailReceiverURL;
private Properties javaMailProperties() {
Properties javaMailProperties = new Properties();
/*
* <prop
* key="mail.imap.socketFactory.class">javax.net.ssl.SSLSocketFactory</
* prop> <prop key="mail.imap.socketFactory.fallback">false</prop> <prop
* key="mail.store.protocol">imaps</prop> <prop
* key="mail.debug">false</prop> <prop
* key="mail.smtp.timeout">10000</prop>
*/
javaMailProperties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailProperties.setProperty("mail.imap.socketFactory.fallback", "false");
javaMailProperties.setProperty("mail.store.protocol", "imaps");
javaMailProperties.setProperty("mail.debug", "true");
javaMailProperties.setProperty("mail.smtp.timeout", "10000");
return javaMailProperties;
}
@Bean
ImapIdleChannelAdapter mailAdapter() {
ImapMailReceiver mailReceiver = new ImapMailReceiver(this.imapMailReceiverURL);
mailReceiver.setJavaMailProperties(javaMailProperties());
mailReceiver.setShouldDeleteMessages(false);
mailReceiver.setShouldMarkMessagesAsRead(true);
ImapIdleChannelAdapter imapIdleChannelAdapter = new
ImapIdleChannelAdapter(mailReceiver);
imapIdleChannelAdapter.setAutoStartup(true);
imapIdleChannelAdapter.setOutputChannel(directChannel());
return imapIdleChannelAdapter;
}
@Bean
public DirectChannel directChannel() {
return new DirectChannel();
}
}
Код Рахула Токасе почти верен, за исключением одной важной вещи. вместо:
@Bean
ImapIdleChannelAdapter mailAdapter() {
ImapMailReceiver mailReceiver = new ImapMailReceiver(this.imapMailReceiverURL);
mailReceiver.setJavaMailProperties(javaMailProperties());
mailReceiver.setShouldDeleteMessages(false);
mailReceiver.setShouldMarkMessagesAsRead(true);
ImapIdleChannelAdapter imapIdleChannelAdapter = new ImapIdleChannelAdapter(mailReceiver);
imapIdleChannelAdapter.setAutoStartup(true);
imapIdleChannelAdapter.setOutputChannel(directChannel());
return imapIdleChannelAdapter;
}
мы должны сделать следующее:
@Bean
ImapIdleChannelAdapter mailAdapter() {
ImapIdleChannelAdapter imapIdleChannelAdapter = new ImapIdleChannelAdapter(mailReceiver());
imapIdleChannelAdapter.setAutoStartup(true);
imapIdleChannelAdapter.setOutputChannel(directChannel());
return imapIdleChannelAdapter;
}
@Bean
ImapMailReceiver mailReceiver() {
ImapMailReceiver mailReceiver = new ImapMailReceiver(this.imapMailReceiverURL);
mailReceiver.setJavaMailProperties(javaMailProperties());
mailReceiver.setShouldDeleteMessages(false);
mailReceiver.setShouldMarkMessagesAsRead(true);
return mailReceiver;
}
В этом случае все компоненты будут правильно инициализированы.