如何使用java buildpack在云代工厂上运行spring应用程序作为一次性任务

时间:2017-03-24 21:43:19

标签: cloudfoundry pivotal-cloud-foundry pivotal-web-services spring-cloud-task

我想在cloudfoundry上运行spring应用程序作为使用java buildpack的一次性任务。

请注意,我的应用程序不是Web应用程序,而是使用spring cloud任务的Spring批处理应用程序。

这是我的清单:

App bignibou-batch is a worker, skipping route creation

每当我推送应用程序时,都会将其检测为工作人员应用程序:

2017-03-24T22:33:50.828+01:00 [CELL/0] [OUT] Destroying container
2017-03-24T22:33:50.854+01:00 [API/3] [OUT] Process has crashed with type: "web"
2017-03-24T22:33:50.873+01:00 [API/3] [OUT] App instance exited with guid befc8bf2-d338-45e1-90b9-430ff3b09a3f payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* Codependent step exited\n* cancelled", "crash_count"=>1, "crash_timestamp"=>1490391230813627797, "version"=>"8f92e459-a6c7-4558-bc0b-09ac398eb069"}
2017-03-24T22:33:51.473+01:00 [CELL/0] [OUT] Successfully destroyed container
2017-03-24T22:33:51.634+01:00 [CELL/0] [OUT] Creating container
2017-03-24T22:33:52.478+01:00 [CELL/0] [OUT] Successfully created container
2017-03-24T22:33:56.824+01:00 [APP/PROC/WEB/0] [OUT] JVM Memory Configuration: -XX:MaxMetaspaceSize=164239K -XX:ReservedCodeCacheSize=240M -XX:CompressedClassSpaceSize=25984K -Xmx295151K -XX:MaxDirectMemorySize=10M
2017-03-24T22:33:56.827+01:00 [APP/PROC/WEB/0] [ERR] JVM Memory Configuration: -XX:ReservedCodeCacheSize=240M -XX:CompressedClassSpaceSize=25984K -Xmx295151K -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=164239K
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] . ____ _ __ _ _
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] \\/ ___)| |_)| | | | | || (_| | ) ) ) )
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] ' |____| .__|_| |_|_| |_\__, | / / / /
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] =========|_|==============|___/=/_/_/_/
2017-03-24T22:33:59.073+01:00 [APP/PROC/WEB/0] [OUT] ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2017-03-24T22:33:59.075+01:00 [APP/PROC/WEB/0] [OUT] :: Spring Boot :: (v1.5.2.RELEASE)
2017-03-24T22:33:59.266+01:00 [APP/PROC/WEB/0] [OUT] 2017-03-24 21:33:59.256 INFO 16 --- [ main] pertySourceApplicationContextInitializer : Adding 'cloud' PropertySource to ApplicationContext
2017-03-24T22:33:59.381+01:00 [APP/PROC/WEB/0] [OUT] 2017-03-24 21:33:59.359 WARN 16 --- [ main] o.c.r.o.s.cloud.AbstractCloudConnector : No suitable service info creator found for service elasticsearch Did you forget to add a ServiceInfoCreator?
2017-03-24T22:33:59.389+01:00 [APP/PROC/WEB/0] [OUT] 2017-03-24 21:33:59.388 INFO 16 --- [ main] nfigurationApplicationContextInitializer : Adding cloud service auto-reconfiguration to ApplicationContext
2017-03-24T22:33:59.465+01:00 [APP/PROC/WEB/0] [OUT] 2017-03-24 21:33:59.451 INFO 16 --- [ main] com.bignibou.batch.Batch : Starting Batch on a1e87528-637d-4dae-62ab-0538e48fb49b with PID 16 (/home/vcap/app/BOOT-INF/classes started by vcap in /home/vcap/app)

这就是我想要的。

但是它尝试将批处理作为Web应用程序启动(仍然在部署应用程序时)...请参阅:

var f:Float = 0.00007075;
var s:String = Std.string(f);

这不是我想要的......

所以我的问题是:

  • 我如何配置我的清单以便批量应用程序被正确推送而不自动启动 - 我只是希望将二进制文件推送到cf以便我以后可以运行任务...
  • 如何在cloudfoundry上启动我的弹簧批作为cf任务?

2 个答案:

答案 0 :(得分:4)

  

如何配置我的清单以便批量应用程序在没有自动启动的情况下正确推送 - 我只是希望将二进制文件推送到cf以便以后可以运行任务...   如何在cloudfoundry上启动我的弹簧批作为cf任务?

为了运行任务,您需要部署一个应用程序并完全上演(因此有一个Droplet)。然后,您可以cf run-task <app> <task-cmd>

一些想法:

第一个选项,您可以像这样使用manifest.yml:

---
applications:
- name: spring-music
  memory: 32M
  path: build/libs/spring-music.war
  health-check-type: none
  no-route: true
  command: while [ 1 == 1 ]; do sleep 9999; done
  buildpack: java_buildpack

这将设置一个具有非常小的内存限制的应用程序和一个基本上什么都不做的命令(永远的部分是关键,以便应用程序将完全启动和启动)。我们还将运行状况检查设置为无和无路由,以便不绑定任何路由且不进行TCP运行状况检查。您可以选择设置构建包。

然后运行cf push。该应用程序应该启动并开始运行。之后,您可以根据需要cf run-task多次。您可以选择停止该应用。

第二个选项,只需推送您的应用程序,而无需进行任何特殊的manifest.yml配置。该应用应该正常播放,无法开始运行,然后失败后您可以cf stop该应用。从那里开始,您应该能够cf run-task多次。

您也可以使用v3 API directly,这会为您提供额外的灵活性,但此时所有互动都是通过cf curl手动完成的。

如果您想查看如何使用cf run-task的具体示例,请参阅Selwyn的回答。

答案 1 :(得分:0)

像按pcf一样推送您的应用

cf push --health-check-type none -p myapp-0.0.1-SNAPSHOT.jar myapp

使用特殊任务启动器将您的应用作为任务启动。您还可以在“ .JarLauncher arg1”之后附加参数,这些参数将以string [] args的形式显示在您的主方法或CommandLineRunner中。

使用任务运行器运行任务。平台内置了对任务的支持。

cf run-task myapp ".java-buildpack/open_jdk_jre/bin/java org.springframework.boot.loader.JarLauncher arg1" --name my-task

下面的注释链接还显示您必须安排时间

来源:https://github.com/joshlong/cf-task-demo