Tuesday, 24 February 2015

Spring Boot - Hello World from the command line to IBM Bluemix in 1 minute

Here is how simple Spring Boot makes saying Hello World web based application with no IDE and no no need to package it up. Nearly as easy as NodeJS

1. Firstly install the Spring Boot CLI. From mac use brew as follows

pas@192-168-1-4:~$ brew tap pivotal/tap
Cloning into '/usr/local/Library/Taps/pivotal/homebrew-tap'...
remote: Counting objects: 366, done.
remote: Total 366 (delta 0), reused 0 (delta 0), pack-reused 366
Receiving objects: 100% (366/366), 60.09 KiB | 84.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
Checking connectivity... done.
Tapped 8 formulae
pas@192-168-1-4:~$ brew install springboot
==> Installing springboot from pivotal/homebrew-tap
==> Downloading https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.2.1.RELEASE/spring-boot-cli-1.2.1.RELEASE-bin.tar.gz
######################################################################## 100.0%
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/springboot/1.2.1.RELEASE: 6 files, 8.6M, built in 98 seconds


2. Now create a simple groovy file called hello.groovy as follows

  
@RestController
class HelloWorld {
  @RequestMapping("/")
  String home() {
    return "Hello World!"
  }
}

3. Run using the spring boot CLI as follows

pas@pass-mbp:~/ibm/software/spring/spring-boot/groovy-example$ spring run hello.groovy

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.1.RELEASE)

2015-02-24 21:13:13.544  INFO 7565 --- [       runner-0] o.s.boot.SpringApplication               : Starting application on 192-168-1-4.tpgi.com.au with PID 7565 (/Users/pas/.m2/repository/org/springframework/boot/spring-boot/1.2.1.RELEASE/spring-boot-1.2.1.RELEASE.jar started by pas in /Users/pas/ibm/software/spring/spring-boot/groovy-example)
2015-02-24 21:13:13.667  INFO 7565 --- [       runner-0] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3b4b551f: startup date [Tue Feb 24 21:13:13 AEDT 2015]; root of context hierarchy
2015-02-24 21:13:14.189  INFO 7565 --- [       runner-0] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-02-24 21:13:14.663  INFO 7565 --- [       runner-0] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2015-02-24 21:13:14.796  INFO 7565 --- [       runner-0] o.apache.catalina.core.StandardService   : Starting service Tomcat
2015-02-24 21:13:14.797  INFO 7565 --- [       runner-0] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.15
2015-02-24 21:13:14.849  INFO 7565 --- [ost-startStop-1] org.apache.catalina.loader.WebappLoader  : Unknown loader org.springframework.boot.cli.compiler.ExtendedGroovyClassLoader$DefaultScopeParentClassLoader@463a88aa class org.springframework.boot.cli.compiler.ExtendedGroovyClassLoader$DefaultScopeParentClassLoader
2015-02-24 21:13:14.868  INFO 7565 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2015-02-24 21:13:14.868  INFO 7565 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1203 ms
2015-02-24 21:13:15.304  INFO 7565 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-02-24 21:13:15.308  INFO 7565 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-02-24 21:13:15.308  INFO 7565 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-02-24 21:13:15.474  INFO 7565 --- [       runner-0] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3b4b551f: startup date [Tue Feb 24 21:13:13 AEDT 2015]; root of context hierarchy
2015-02-24 21:13:15.513  INFO 7565 --- [       runner-0] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String HelloWorld.home()
2015-02-24 21:13:15.514  INFO 7565 --- [       runner-0] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-02-24 21:13:15.515  INFO 7565 --- [       runner-0] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2015-02-24 21:13:15.537  INFO 7565 --- [       runner-0] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-02-24 21:13:15.537  INFO 7565 --- [       runner-0] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-02-24 21:13:15.568  INFO 7565 --- [       runner-0] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-02-24 21:13:15.927  INFO 7565 --- [       runner-0] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2015-02-24 21:13:15.964  INFO 7565 --- [       runner-0] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2015-02-24 21:13:15.965  INFO 7565 --- [       runner-0] o.s.boot.SpringApplication               : Started application in 2.568 seconds (JVM running for 3.81)


4. Invoke in a browser and you have your "Hello World" or just use "curl" as follows

pas@192-168-1-4:~/ibm/software/spring/spring-boot/groovy-example$ curl http://localhost:8080
Hello World!


5. Finally lets create a runnable JAR we can then deploy to IBM Bluemix

pas@192-168-1-4:~/ibm/software/spring/spring-boot/groovy-example$ spring jar hello.jar hello.groovy

6. Finally deploy to IBM Bluemix using the runnable JAR file as follows

pas@192-168-1-4:~/ibm/software/spring/spring-boot/groovy-example$ cf push hello-spring-boot -i 1 -m 256M -p ./hello.jar
Creating app hello-spring-boot in org pasapi@au1.ibm.com / space apple as pasapi@au1.ibm.com...
OK

Creating route hello-spring-boot.mybluemix.net...
OK

Binding hello-spring-boot.mybluemix.net to hello-spring-boot...
OK

Uploading hello-spring-boot...
Uploading app files from: ./hello.jar
Uploading 855.6K, 95 files
Done uploading
OK

Starting app hello-spring-boot in org pasapi@au1.ibm.com / space apple as pasapi@au1.ibm.com...
-----> Downloaded app package (15M)
-----> Liberty Buildpack Version: v1.13-20150209-1122
-----> Avoid Trouble: Specify a minimum of 512M as the Memory Limit for your apps when using IBM JDK.
-----> Retrieving IBM 1.7.1_sr2fp1ifx-20141220 JRE (ibm-java-jre-7.1-2.1-pxa6470_27sr2fp1ifx-20141220_02-sfj.tgz) ... (0.0s)
-----> Retrieving App Management Agent 2015.02.04_102631 (com.ibm.ws.cloudoe.app-mgmt-proxy-agent.zip) ... (0.0s)
         Expanding App Management to .app-management (0.0s)
-----> Downloading Auto Reconfiguration 1.7.0_RELEASE from https://download.run.pivotal.io/auto-reconfiguration/auto-reconfiguration-1.7.0_RELEASE.jar (0.8s)
-----> Liberty buildpack is done creating the droplet


0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK

App hello-spring-boot was started using this command `$PWD/.java/jre/bin/java -Xtune:virtualized -Xmx192M -Xdump:none -Xdump:heap:defaults:file=./../dumps/heapdump.%Y%m%d.%H%M%S.%pid.%seq.phd -Xdump:java:defaults:file=./../dumps/javacore.%Y%m%d.%H%M%S.%pid.%seq.txt -Xdump:snap:defaults:file=./../dumps/Snap.%Y%m%d.%H%M%S.%pid.%seq.trc -Xdump:heap+java+snap:events=user -Xdump:tool:events=systhrow,filter=java/lang/OutOfMemoryError,request=serial+exclusive,exec=./.buildpack-diagnostics/killjava.sh $JVM_ARGS org.springframework.boot.loader.JarLauncher --server.port=$PORT`

Showing health and status for app hello-spring-boot in org pasapi@au1.ibm.com / space apple as pasapi@au1.ibm.com...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: hello-spring-boot.mybluemix.net
last uploaded: Tue Feb 24 10:19:56 +0000 2015

     state     since                    cpu    memory           disk          details
#0   running   2015-02-24 09:21:03 PM   0.0%   128.8M of 256M   99.7M of 1G



Saturday, 21 February 2015

IBM Bluemix - Deploy your app the way you want

We recently upgraded our capability in the IBM public cloud. Before this new version you could build, test, and deploy apps on Bluemix by using open source Cloud Foundry technology. But now you have more choice bringing two new options as follows

1. IBM Containers Beta

Use IBM Containers to run apps and services in a hosted cloud environment. Port your existing applications to IBM Bluemix and make them publicly accessible and composable. Use a private registry to upload, store, and retrieve your trusted images.

2. Virtual Machines Beta

Get total control over your app's infrastructure by deploying virtual machines. Manage them from the Bluemix dashboard, or from anywhere with OpenStack APIs.


Try it out as follows

https://console.ng.bluemix.net/

Tuesday, 17 February 2015

Creating an IBM Bluemix Server Connection from Eclipse

The post below shows how to create an IBM Bluemix server connection into the USA public hosted PaaS using Eclipse. It assumes you already have an existing account setup with http://bluemix.net/

1. Ensure you have added "IBM Eclipse Tools for Bluemix" as shown in the marketplace installed items.


More info can be found here.

http://marketplace.eclipse.org/content/ibm-eclipse-tools-bluemix

2. In the "Servers" tab click the link to create a new server and click on IBM Bluemix as shown below.


3. Click Next
4. Enter your account details, you can target the public cloud depending on the location, the default is USA based PUBLIC cloud instance


5. Click Next
6. Select the space to target for deployed applications


7. Click Finish

By clicking on the connection you can view connection attributes, plus deployed application, services, routes, memory settings plus more.



The following UTube video shows this in more detail.

https://www.youtube.com/watch?v=GpkXgklzOlk
IBM Eclipse Tools for Bluemix
IBM Eclipse Tools for Bluemix

Monday, 16 February 2015

Spring Boot JPA Thymeleaf application deployed to IBM Bluemix

IBM Bluemix is an open-standards, cloud-based platform for building, managing, and running apps of all types, such as web, mobile, big data, and smart devices. Capabilities include Java, mobile back-end development, and application monitoring, as well as features from ecosystem partners and open source—all provided as-a-service in the cloud.

The example below shows how to deploy an spring boot JPA application to IBM Bluemix. The example is based on the code below.

https://github.com/papicella/BluemixSpringBootJPA

1. Target the IBM Bluemix

cf api https://api.ng.bluemix.net

2. Log in as follows

cf login -u pasapi@au1.ibm.com -p ******-o pasapi@au1.ibm.com -s dev

3. Create a MYSQL service as shown below.

pas.apicella@IBM-XD082415H ~/bluemix-apps/spring-data-jpa-thymeleaf/mysql
$ cf create-service mysql 100 dev-mysql
Creating service dev-mysql in org pasapi@au1.ibm.com / space dev as pasapi@au1.ibm.com...
OK


4.  At this point lets run the application using an embedded tomcat server as shown below.

pas.apicella@IBM-XD082415H ~/bluemix-apps/spring-data-jpa-thymeleaf/mysql
$ java -jar BluemixSpringBootJPA-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.0.RELEASE)

2015-02-16 20:12:18.289  INFO 15824 --- [           main] p.cloud.webapp.ApplesCfDemoApplication   : Starting ApplesCfDemoApplication on IBM-XD082415H with PID 15824 (C:\ibm\bluemix\apps\spring-data-jpa-thymeleaf\mysql\BluemixSpringBootJPA-0.0.1-SNAPSHOT.jar started by pas.apicella in C:\ibm\bluemix\apps\spring-data-jpa-thymeleaf\mysql)
2015-02-16 20:12:18.356  INFO 15824 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6b51dbf6: startup date [Mon Feb 16 20:12:18 AEDT 2015]; root of context hierarchy
2015-02-16 20:12:20.679  INFO 15824 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration' of type [class org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-02-16 20:12:20.779  INFO 15824 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$15fe846f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-02-16 20:12:20.831  INFO 15824 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'transactionAttributeSource' of type [class org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-02-16 20:12:20.853  INFO 15824 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'transactionInterceptor' of type [class org.springframework.transaction.interceptor.TransactionInterceptor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

.....

class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-02-16 20:12:27.710  INFO 15824 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-02-16 20:12:28.385  INFO 15824 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2015-02-16 20:12:28.510  INFO 15824 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2015-02-16 20:12:28.513  INFO 15824 --- [           main] p.cloud.webapp.ApplesCfDemoApplication   : Started ApplesCfDemoApplication in 10.626 seconds (JVM running for 11.481)


5. Now using a manifest.yml as follows deploy the application to bluemix as shown below.

manifest.yml

applications:
- name: pas-mj-albums
  memory: 512M
  instances: 1
  host: pas-albums
  domain: mybluemix.net
  path: ./BluemixSpringBootJPA-0.0.1-SNAPSHOT.jar
  buildpack: https://github.com/cloudfoundry/java-buildpack.git
  services:
    - dev-mysql


Deployment output

pas.apicella@IBM-XD082415H ~/bluemix-apps/spring-data-jpa-thymeleaf/mysql
$ cf push -f manifest.yml
Using manifest file manifest.yml

Creating app pas-mj-albums in org pasapi@au1.ibm.com / space dev as pasapi@au1.ibm.com...
OK

Creating route pas-mj-albums.mybluemix.net...
OK

Binding pas-mj-albums.mybluemix.net to pas-mj-albums...
OK

Uploading pas-mj-albums...
Uploading app files from: BluemixSpringBootJPA-0.0.1-SNAPSHOT.jar
Uploading 837.2K, 135 files
Done uploading
OK
Binding service dev-mysql to app pas-mj-albums in org pasapi@au1.ibm.com / space dev as pasapi@au1.ibm.com...
OK

Starting app pas-mj-albums in org pasapi@au1.ibm.com / space dev as pasapi@au1.ibm.com...
-----> Java Buildpack Version: 303bda3 | https://github.com/cloudfoundry/java-buildpack.git#303bda3
-----> Uploading droplet (64M)

0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK

App pas-mj-albums was started using this command `SERVER_PORT=$PORT $PWD/.java-buildpack/open_jdk_jre/bin/java -cp $PWD/.:$PWD/.java-buildpack/spring_auto_reconfiguration/spring_auto_reconfiguration-1.7.0_RELEASE.jar -Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh -Xmx382293K -Xms382293K -XX:MaxMetaspaceSize=64M -XX:MetaspaceSize=64M -Xss995K org.springframework.boot.loader.JarLauncher`

Showing health and status for app pas-mj-albums in org pasapi@au1.ibm.com / space dev as pasapi@au1.ibm.com...
OK

requested state: started
instances: ?/1
usage: 512M x 1 instances
urls: pas-mj-albums.mybluemix.net
last uploaded: Mon Feb 16 09:18:28 +0000 2015

     state     since                    cpu    memory           disk
#0   running   2015-02-16 08:20:04 PM   0.0%   393.4M of 512M   129.3M of 1G


6. Once deployed the Bluemix Console page shows it deployed as follows


7. Finally invoking the application using the unique route as follows

http://pas-mj-albums.mybluemix.net/albums





More Information

https://www.ng.bluemix.net/docs/#