我正在尝试为“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
我面临的问题是:
- 源类型已成功部署并显示在应用列表中,但当我运行应用信息 source:tail时,应用属性信息未显示,请查看下面的屏幕截图。
jar 结构与 File 源引导 jar 完全相同,是使用 Spring 的 Maven 包装器构建的。带有元数据的 json 属性文件也是根据预期生成的,并且存在于捆绑的 spring 源 jar 中的 META_INF 中。
- 源本身不起作用。当我尝试将这个新的尾源与日志接收器一起使用时,它永远不会起作用。
最后,我确实知道它可能无法在云服务器上运行,但计划是在本地服务器-本地数据流服务器上运行它。我也知道我可以尝试使用 spring 集成框架本身,但它是通过 spring cloud Dataflow 完成此任务的外部请求。
非常感谢任何帮助,我的请求发给Artem ( https://stackoverflow.com/users/2756547/artem-bilan)、Gary(https://stackoverflow.com/users/1240763/gary-russell )和来自所有社区的其他人。提前感谢您的评论和反馈!