1

我正在尝试为“Tailing”编写自定义源代码,并使用 spring 示例中的片段来编写该代码。这是实际的代码,

@ComponentScan
@EnableBinding(Source.class)
@EnableConfigurationProperties(TailSourceProperties.class)
public class TailSourceConfiguration {
    @Autowired
    private TailSourceProperties properties;
    private final Logger logger = LoggerFactory.getLogger(TailSourceConfiguration.class); 

    @Autowired
    Source source;

    @Bean
    public IntegrationFlow tailFlow() {
        return IntegrationFlows.from((MessageProducers p) ->p.tail(new File(properties.getFilename())).delay(500).end(false).autoStartup(true)).channel(source.output()).get();
    }
}

属性文件是,

@ConfigurationProperties("tail")
public class TailSourceProperties {

    /**
     * The file name to tail
     */
    @Value("#{ systemProperties['tail.file'] ?: '/tmp/tailfile.log'}")
    private String filename;

     /**
     * the native options to be used in conjunction with the tail command eg. -F -n 0 etc.
     */
    @Value("#{ systemProperties['tail.nativeoptions'] ?: '-F -n 0'}")
    private String nativeOptions;

    public String getNativeOptions() {
        return nativeOptions;
    }

    public void setNativeOptions(String nativeOptions) {
        this.nativeOptions = nativeOptions;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

}

现在,当我使用此代码运行 junit 测试时,使用下面的 junit 测试用例它工作得很好。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TailSourceApplication.class)
@DirtiesContext
public abstract class TailSourceTests {


    @Autowired
    protected Source source;

    @Autowired
    protected MessageCollector messageCollector;


    @IntegrationTest({})
    public static class payloadTest extends TailSourceTests {

        @Test
        public void otherTest() throws Exception
        {
            Message<?> received= messageCollector.forChannel(source.output()).poll(10, TimeUnit.SECONDS);
            System.out.println("Received ="+received);
        }

        @Test
        public void testSimpleFile() throws Exception {
            int i = messageCollector.forChannel(source.output()).size();
            System.out.println("Size = +"+i);
            Message<?> received= messageCollector.forChannel(source.output()).poll(10, TimeUnit.SECONDS);
            for (Iterator<Message<?>> iter = messageCollector.forChannel(source.output()).iterator(); iter.hasNext();)
                    {
                System.out.println("value ="+iter.next().getPayload());
                    }
            System.out.println("RECEIVED = "+received);
            Assert.notNull(received);
        }
    }


    @SpringBootApplication
    static class TailSourceApplication {

        public static void main(String[] args) {
            SpringApplication.run(TailSourceApplication.class, args);
        }

    }

}

运行 junit 测试时,我确实在控制台中看到了默认文件内容。

现在,当我尝试将其捆绑在一个 jar 中并将其部署到具有版本的本地 spring 云数据流服务器时,我面临两个问题:

  • spring-cloud-dataflow-server-local-1.0.1.BUILD-SNAPSHOT.jar
  • spring-cloud-dataflow-server-local-1.0.0.RELEASE.jar

我使用的 shell jar 版本是,

  • spring-cloud-dataflow-shell-1.0.1.BUILD-SNAPSHOT.jar

我面临的问题是:

  1. 源类型已成功部署并显示在应用列表中,但当我运行应用信息 source:tail时,应用属性信息未显示,请查看下面的屏幕截图。

外壳截图

jar 结构与 File 源引导 jar 完全相同,是使用 Spring 的 Maven 包装器构建的。带有元数据的 json 属性文件也是根据预期生成的,并且存在于捆绑的 spring 源 jar 中的 META_INF 中。

  1. 源本身不起作用。当我尝试将这个新的尾源与日志接收器一起使用时,它永远不会起作用。

最后,我确实知道它可能无法在云服务器上运行,但计划是在本地服务器-本地数据流服务器上运行它。我也知道我可以尝试使用 spring 集成框架本身,但它是通过 spring cloud Dataflow 完成此任务的外部请求。

非常感谢任何帮助,我的请求发给Artem ( https://stackoverflow.com/users/2756547/artem-bilan)、Gary(https://stackoverflow.com/users/1240763/gary-russell )和来自所有社区的其他人。提前感谢您的评论和反馈!

4

1 回答 1

1

首先感谢邀请审查您的工作:)。

其次,这是一项伟大的工作,我坚持将其贡献回框架。我们在 Spring XD 中有这样一个模块,我不确定是什么阻止了我们也将 Spring Cloud Stream Apps 扩展到tail。因此,请随时填写有关此事的问题并公关解决方案!

现在,我认为您必须将spring-configuration-metadata-whitelist.properties文件添加到META-INF您的 jar 中。

您的内容必须是这样的:

configuration-properties.classes=[THE_PACKAGE_TO_CLASS].TailSourceProperties

如果没有正确的 Binder 组装,它也不会按原样工作。

您必须在项目中添加spring-cloud-stream-binder-rabbit-1.0.0.RELEASE依赖项才能使用 RabbitMQ Binder 构建目标 uber jar。或者spring-cloud-stream-binder-kafka,如果这是你的情况。

在 Spring Cloud Stream App Starters Stream README中查看更多信息。

于 2016-08-30T21:40:11.747 回答