\n\u003Ctask:annotation-driven executor=\"myExecutor\" scheduler=\"myScheduler\" />\n\u003Ctask:executor id=\"myExecutor\" pool-size=\"5\" />\n\u003Ctask:scheduler id=\"myScheduler\" pool-size=\"10\" />\n","xml",[2721,5396,5397,5402,5407,5412],{"__ignoreMap":11},[1732,5398,5399],{"class":3115,"line":3116},[1732,5400,5401],{},"\u003Cbean id=\"myClass\" class=\"my.project.path.myClass\" />\n",[1732,5403,5404],{"class":3115,"line":12},[1732,5405,5406],{},"\u003Ctask:annotation-driven executor=\"myExecutor\" scheduler=\"myScheduler\" />\n",[1732,5408,5409],{"class":3115,"line":186},[1732,5410,5411],{},"\u003Ctask:executor id=\"myExecutor\" pool-size=\"5\" />\n",[1732,5413,5414],{"class":3115,"line":3141},[1732,5415,5416],{},"\u003Ctask:scheduler id=\"myScheduler\" pool-size=\"10\" />\n",[81,5418,5420],{"id":5419},"the-scheduled-annotation","The @Scheduled annotation",[47,5422,5423],{},"With the @Scheduled annotation you can execute your method as a cron job. Using this annotation requires that the method\nto be scheduled must be of type void and must not expect any arguments. The following examples show you how to use the\n@Scheduled annotation.",[47,5425,5426],{},"If you want periodic scheduling you can use the property fixedRate. In this example the method would be executed every\n42 seconds.",[3106,5428,5432],{"className":5429,"code":5430,"language":5431,"meta":11,"style":11},"language-java shiki shiki-themes github-light github-dark","@Scheduled(fixedRate = 42000)\npublic void execute() {\n // do something\n}\n","java",[2721,5433,5434,5439,5444,5449],{"__ignoreMap":11},[1732,5435,5436],{"class":3115,"line":3116},[1732,5437,5438],{},"@Scheduled(fixedRate = 42000)\n",[1732,5440,5441],{"class":3115,"line":12},[1732,5442,5443],{},"public void execute() {\n",[1732,5445,5446],{"class":3115,"line":186},[1732,5447,5448],{}," // do something\n",[1732,5450,5451],{"class":3115,"line":3141},[1732,5452,5453],{},"}\n",[47,5455,5456],{},"If you prefer cron expressions you can use them either. The following example is analogue to the example above only\nusing cron expressions. The annotated method would be executed each full minute and every 7 seconds.",[3106,5458,5460],{"className":5429,"code":5459,"language":5431,"meta":11,"style":11},"@Scheduled(cron = \"*/7 * * * * *\")\npublic void execute() {\n // do something\n}\n",[2721,5461,5462,5467,5471,5475],{"__ignoreMap":11},[1732,5463,5464],{"class":3115,"line":3116},[1732,5465,5466],{},"@Scheduled(cron = \"*/7 * * * * *\")\n",[1732,5468,5469],{"class":3115,"line":12},[1732,5470,5443],{},[1732,5472,5473],{"class":3115,"line":186},[1732,5474,5448],{},[1732,5476,5477],{"class":3115,"line":3141},[1732,5478,5453],{},[47,5480,5481],{},"Without question you have much more possibilities with cron expressions than with periodic scheduling. In this example\nyour method would be executed every weekday (Monday to Friday) on 9.45 am.",[3106,5483,5485],{"className":5429,"code":5484,"language":5431,"meta":11,"style":11},"@Scheduled(cron = \"0 45 9 * * MON-FRI\")\npublic void execute() {\n // do something\n}\n",[2721,5486,5487,5492,5496,5500],{"__ignoreMap":11},[1732,5488,5489],{"class":3115,"line":3116},[1732,5490,5491],{},"@Scheduled(cron = \"0 45 9 * * MON-FRI\")\n",[1732,5493,5494],{"class":3115,"line":12},[1732,5495,5443],{},[1732,5497,5498],{"class":3115,"line":186},[1732,5499,5448],{},[1732,5501,5502],{"class":3115,"line":3141},[1732,5503,5453],{},[47,5505,5506],{},"A pretty cool feature is that you even can use placeholders for your cron expression which are resolved against the\nconfigured property-placeholder.",[3106,5508,5510],{"className":5429,"code":5509,"language":5431,"meta":11,"style":11},"@Scheduled(cron = \"${myclass.cron.execute.sth}\")\npublic void execute() {\n // do something\n}\n",[2721,5511,5512,5517,5521,5525],{"__ignoreMap":11},[1732,5513,5514],{"class":3115,"line":3116},[1732,5515,5516],{},"@Scheduled(cron = \"${myclass.cron.execute.sth}\")\n",[1732,5518,5519],{"class":3115,"line":12},[1732,5520,5443],{},[1732,5522,5523],{"class":3115,"line":186},[1732,5524,5448],{},[1732,5526,5527],{"class":3115,"line":3141},[1732,5528,5453],{},[47,5530,5531],{},"Define where the properties are loaded from within your application context:",[3106,5533,5535],{"className":5392,"code":5534,"language":5394,"meta":11,"style":11},"\u003Ccontext:property-placeholder location=\"classpath:application.properties\"/>\n",[2721,5536,5537],{"__ignoreMap":11},[1732,5538,5539],{"class":3115,"line":3116},[1732,5540,5534],{},[47,5542,5543],{},"Then the properties are loaded from the file which contains your cron-expressions like this:",[3106,5545,5547],{"className":3241,"code":5546,"language":3243,"meta":11,"style":11},"myclass.cron.execute.sth=0 45 9 * * MON-FRI\n",[2721,5548,5549],{"__ignoreMap":11},[1732,5550,5551],{"class":3115,"line":3116},[1732,5552,5546],{},[81,5554,5556],{"id":5555},"the-async-annotation","The @Async annotation",[47,5558,5559],{},"The @Async annotation allows you to invoke your method asynchronously. The execution of the method will occur in a task\nthat has been submitted to the TaskExecutor defined in your application context. Contrary to the methods annotated with\nthe @Scheduled annotations the methods you annotate with @Async may be of other type than void and can expect arguments.",[47,5561,5562],{},"This is a simple example of a @Async annotated method without a return value.",[3106,5564,5566],{"className":5429,"code":5565,"language":5431,"meta":11,"style":11},"@Async\nvoid execute(String string) {\n // do something asynchronously\n}\n",[2721,5567,5568,5573,5578,5583],{"__ignoreMap":11},[1732,5569,5570],{"class":3115,"line":3116},[1732,5571,5572],{},"@Async\n",[1732,5574,5575],{"class":3115,"line":12},[1732,5576,5577],{},"void execute(String string) {\n",[1732,5579,5580],{"class":3115,"line":186},[1732,5581,5582],{}," // do something asynchronously\n",[1732,5584,5585],{"class":3115,"line":3141},[1732,5586,5453],{},[47,5588,5589],{},"Like mentioned above your @Async annotated method may have a return value. However this return value must be of type\nFuture. This means that first the other tasks are performed and then is called get() on that Future.",[3106,5591,5593],{"className":5429,"code":5592,"language":5431,"meta":11,"style":11},"@Async\nFuture\u003CString> execute(String string) {\n // do something asynchronously\n}\n",[2721,5594,5595,5599,5604,5608],{"__ignoreMap":11},[1732,5596,5597],{"class":3115,"line":3116},[1732,5598,5572],{},[1732,5600,5601],{"class":3115,"line":12},[1732,5602,5603],{},"Future\u003CString> execute(String string) {\n",[1732,5605,5606],{"class":3115,"line":186},[1732,5607,5582],{},[1732,5609,5610],{"class":3115,"line":3141},[1732,5611,5453],{},[81,5613,5615],{"id":5614},"further-information","Further information",[47,5617,5618,5619],{},"Have a look at\nthe ",[51,5620,5623],{"href":5621,"rel":5622},"http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#scheduling",[55],"Spring Framework Reference Documentation",[5170,5625,5626],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":11,"searchDepth":12,"depth":12,"links":5628},[5629,5630,5631,5632],{"id":5385,"depth":186,"text":5386},{"id":5419,"depth":186,"text":5420},{"id":5555,"depth":186,"text":5556},{"id":5614,"depth":186,"text":5615},[2986,5192],"2012-06-13T15:49:15","You want to execute cron jobs or call your methods asynchronously? Thanks to Spring’s annotation support for scheduling\\nand asynchronous execution you can achieve this in a few minutes.","https://synyx.de/blog/scheduling-and-asynchronous-execution-with-spring/",{},"/blog/scheduling-and-asynchronous-execution-with-spring",{"title":5373,"description":5382},"blog/scheduling-and-asynchronous-execution-with-spring",[5642,5643,5644,5645,5646,5647],"async","scheduled","asynchronous","scheduling","spring","spring-annotations","You want to execute cron jobs or call your methods asynchronously? Thanks to Spring’s annotation support for scheduling and asynchronous execution you can achieve this in a few minutes. Some…","fzW4lb1yw0kNbXB83aAmQzrzjrslpT-gtiBvUzbdR7Q",{"id":5651,"title":5652,"author":5653,"body":5654,"category":6307,"date":6308,"description":6309,"extension":17,"link":6310,"meta":6311,"navigation":28,"path":6312,"seo":6313,"slug":5658,"stem":6314,"tags":6315,"teaser":6323,"__hash__":6324},"blog/blog/how-to-monitor-and-manage-your-java-application-with-jmx.md","How to monitor and manage your Java application with JMX",[32],{"type":8,"value":5655,"toc":6300},[5656,5659,5662,5677,5753,5756,5760,5763,5853,5856,5863,5867,5881,5886,5891,5914,5917,5922,5927,5951,5954,5977,5982,5987,6011,6017,6056,6065,6069,6072,6077,6080,6086,6091,6094,6100,6103,6106,6140,6143,6193,6197,6200,6203,6264,6267,6271,6277,6284,6291,6298],[43,5657,5652],{"id":5658},"how-to-monitor-and-manage-your-java-application-with-jmx",[47,5660,5661],{},"JMX (Java Management Extensions) provides the infrastructure to support monitoring and management of your Java\napplications. Resources you manage with JMX are called Managed Beans (MBeans). I want to show you how to quickly\nregister your own Service as MBean using Spring and Source-Level Metadata (JDK 5.0+ annotations).",[47,5663,5664,5665,5668,5669,5672,5673,5676],{},"The following sample is built on a tool that allows to manage the staffs’ applications for vacation digitally instead of\nusing paper. If a staff member applies for leave, the application gets the status ",[132,5666,5667],{},"waiting",". Then an authorized person (\nthe boss) has to decide about this application. It may be set to ",[132,5670,5671],{},"allowed"," or to ",[132,5674,5675],{},"rejected",". It might be that you want\nto have an overview of the applications and their status and you may even want to remind the authorized persons via\nemail to review the pending applications. Even if the vacation management tool has a web-based frontend for doing the\nmost of the actions, I think it still makes a good example for describing how to use JMX in your Java application. The\nfollowing class is a skeleton of the class which shall be exposed to JMX as MBean.",[3106,5678,5680],{"className":5429,"code":5679,"language":5431,"meta":11,"style":11},"public class JmxDemo {\n private long numberOfWaitingApplications;\n public long getNumberOfWaitingApplications() {\n return numberOfWaitingApplications;\n }\n public long countApplicationsInStatus(String status) {\n // do something and return number of applications with the given status\n }\n public List\u003CString> showWaitingApplications() {\n // do something and return a list of all waiting applications\n }\n public String remindBossAboutWaitingApplications() {\n // remind the boss via email to decide about the waiting applications\n }\n}\n",[2721,5681,5682,5687,5692,5697,5702,5707,5712,5717,5721,5726,5731,5735,5740,5745,5749],{"__ignoreMap":11},[1732,5683,5684],{"class":3115,"line":3116},[1732,5685,5686],{},"public class JmxDemo {\n",[1732,5688,5689],{"class":3115,"line":12},[1732,5690,5691],{}," private long numberOfWaitingApplications;\n",[1732,5693,5694],{"class":3115,"line":186},[1732,5695,5696],{}," public long getNumberOfWaitingApplications() {\n",[1732,5698,5699],{"class":3115,"line":3141},[1732,5700,5701],{}," return numberOfWaitingApplications;\n",[1732,5703,5704],{"class":3115,"line":3196},[1732,5705,5706],{}," }\n",[1732,5708,5709],{"class":3115,"line":3202},[1732,5710,5711],{}," public long countApplicationsInStatus(String status) {\n",[1732,5713,5714],{"class":3115,"line":3212},[1732,5715,5716],{}," // do something and return number of applications with the given status\n",[1732,5718,5719],{"class":3115,"line":3346},[1732,5720,5706],{},[1732,5722,5723],{"class":3115,"line":3357},[1732,5724,5725],{}," public List\u003CString> showWaitingApplications() {\n",[1732,5727,5728],{"class":3115,"line":3363},[1732,5729,5730],{}," // do something and return a list of all waiting applications\n",[1732,5732,5733],{"class":3115,"line":3369},[1732,5734,5706],{},[1732,5736,5737],{"class":3115,"line":3384},[1732,5738,5739],{}," public String remindBossAboutWaitingApplications() {\n",[1732,5741,5742],{"class":3115,"line":3390},[1732,5743,5744],{}," // remind the boss via email to decide about the waiting applications\n",[1732,5746,5747],{"class":3115,"line":3396},[1732,5748,5706],{},[1732,5750,5751],{"class":3115,"line":3402},[1732,5752,5453],{},[47,5754,5755],{},"If you want to use this class as a MBean, a few steps are necessary.",[81,5757,5759],{"id":5758},"_1-not-yet-another-xml-file","1. Not yet another xml file…",[47,5761,5762],{},"It’s best you create an extra xml file (let’s call it jmxContext.xml) for JMX configuration and import it in your\napplicationContext.xml. In your jmxContext.xml you define your MBean and the MBeanExporter.",[3106,5764,5766],{"className":5392,"code":5765,"language":5394,"meta":11,"style":11},"\n\u003Cbean id=\"jmxDemo\" class=\"org.synyx.urlaubsverwaltung.jmx.JmxDemo\">\n \u003C!-- maybe you need contructor-injection -->\n \u003C!-- \u003Cconstructor-arg ref=\"myService\" /> -->\n\u003C/bean>\n \u003C!-- you may just copy the following lines -->\n\u003Cbean id=\"exporter\" class=\"org.springframework.jmx.export.MBeanExporter\" lazy-init=\"false\">\n\u003Cproperty name=\"autodetect\" value=\"true\"/>\n\u003Cproperty name=\"namingStrategy\" ref=\"namingStrategy\"/>\n\u003Cproperty name=\"assembler\" ref=\"assembler\"/>\n\u003C/bean>\n\u003Cbean id=\"jmxAttributeSource\" class=\"org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource\"/>\n\u003Cbean id=\"assembler\" class=\"org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler\">\n\u003Cproperty name=\"attributeSource\" ref=\"jmxAttributeSource\"/>\n\u003C/bean>\n\u003Cbean id=\"namingStrategy\" class=\"org.springframework.jmx.export.naming.MetadataNamingStrategy\">\n\u003Cproperty name=\"attributeSource\" ref=\"jmxAttributeSource\"/>\n\u003C/bean>\n",[2721,5767,5768,5772,5777,5782,5787,5792,5797,5802,5807,5812,5817,5821,5826,5831,5836,5840,5845,5849],{"__ignoreMap":11},[1732,5769,5770],{"class":3115,"line":3116},[1732,5771,3119],{"emptyLinePlaceholder":28},[1732,5773,5774],{"class":3115,"line":12},[1732,5775,5776],{},"\u003Cbean id=\"jmxDemo\" class=\"org.synyx.urlaubsverwaltung.jmx.JmxDemo\">\n",[1732,5778,5779],{"class":3115,"line":186},[1732,5780,5781],{}," \u003C!-- maybe you need contructor-injection -->\n",[1732,5783,5784],{"class":3115,"line":3141},[1732,5785,5786],{}," \u003C!-- \u003Cconstructor-arg ref=\"myService\" /> -->\n",[1732,5788,5789],{"class":3115,"line":3196},[1732,5790,5791],{},"\u003C/bean>\n",[1732,5793,5794],{"class":3115,"line":3202},[1732,5795,5796],{}," \u003C!-- you may just copy the following lines -->\n",[1732,5798,5799],{"class":3115,"line":3212},[1732,5800,5801],{},"\u003Cbean id=\"exporter\" class=\"org.springframework.jmx.export.MBeanExporter\" lazy-init=\"false\">\n",[1732,5803,5804],{"class":3115,"line":3346},[1732,5805,5806],{},"\u003Cproperty name=\"autodetect\" value=\"true\"/>\n",[1732,5808,5809],{"class":3115,"line":3357},[1732,5810,5811],{},"\u003Cproperty name=\"namingStrategy\" ref=\"namingStrategy\"/>\n",[1732,5813,5814],{"class":3115,"line":3363},[1732,5815,5816],{},"\u003Cproperty name=\"assembler\" ref=\"assembler\"/>\n",[1732,5818,5819],{"class":3115,"line":3369},[1732,5820,5791],{},[1732,5822,5823],{"class":3115,"line":3384},[1732,5824,5825],{},"\u003Cbean id=\"jmxAttributeSource\" class=\"org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource\"/>\n",[1732,5827,5828],{"class":3115,"line":3390},[1732,5829,5830],{},"\u003Cbean id=\"assembler\" class=\"org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler\">\n",[1732,5832,5833],{"class":3115,"line":3396},[1732,5834,5835],{},"\u003Cproperty name=\"attributeSource\" ref=\"jmxAttributeSource\"/>\n",[1732,5837,5838],{"class":3115,"line":3402},[1732,5839,5791],{},[1732,5841,5842],{"class":3115,"line":3408},[1732,5843,5844],{},"\u003Cbean id=\"namingStrategy\" class=\"org.springframework.jmx.export.naming.MetadataNamingStrategy\">\n",[1732,5846,5847],{"class":3115,"line":3414},[1732,5848,5835],{},[1732,5850,5851],{"class":3115,"line":3420},[1732,5852,5791],{},[47,5854,5855],{},"If your application is running inside a container such as Tomcat, you even don’t have to configure the MBeanServer\nbecause the container has its own one.",[47,5857,5858,5859,5862],{},"Setting MBeanExporter’s property ",[132,5860,5861],{},"autodetect"," to true, means that the MBeanExporter will register all the Beans within\nyour application’s context that are annotated in the way described in the next section as MBeans.",[81,5864,5866],{"id":5865},"_2-lets-transform-your-spring-bean-to-a-managed-bean","2. Let’s transform your Spring Bean to a Managed Bean!",[47,5868,5869,5870,5873,5874,5877,5878,177],{},"Spring uses information provided by annotations to generate MBeans. The attributes of the annotations are speaking for\nthemselves so further description isn’t necessary. To mark a Bean for export, it has to be annotated with\n",[132,5871,5872],{},"@ManagedResource",", Attributes are annotated with ",[132,5875,5876],{},"@ManagedAttribute"," and Methods with ",[132,5879,5880],{},"@ManagedOperation",[47,5882,5883],{},[67,5884,5885],{},"2.1 Bean",[47,5887,5888,5889,177],{},"Mark your Bean with ",[132,5890,5872],{},[3106,5892,5894],{"className":5429,"code":5893,"language":5431,"meta":11,"style":11},"@ManagedResource(objectName = \"mbeans:name=myJmxDemoBean\", description = \"My managed Bean.\")\npublic class JmxDemo {\n // lot of stuff\n}\n",[2721,5895,5896,5901,5905,5910],{"__ignoreMap":11},[1732,5897,5898],{"class":3115,"line":3116},[1732,5899,5900],{},"@ManagedResource(objectName = \"mbeans:name=myJmxDemoBean\", description = \"My managed Bean.\")\n",[1732,5902,5903],{"class":3115,"line":12},[1732,5904,5686],{},[1732,5906,5907],{"class":3115,"line":186},[1732,5908,5909],{}," // lot of stuff\n",[1732,5911,5912],{"class":3115,"line":3141},[1732,5913,5453],{},[47,5915,5916],{},"Make sure that your MBean doesn’t contain ‘MBean’ in its name since it would be treated as a StandardMBean causing your\nannotations not to work.",[47,5918,5919],{},[67,5920,5921],{},"2.2 Attributes",[47,5923,5924,5925,177],{},"Annotate the Getter and Setter with ",[132,5926,5876],{},[3106,5928,5930],{"className":5429,"code":5929,"language":5431,"meta":11,"style":11},"@ManagedAttribute(description = \"Get the number of all waiting applications\" )\npublic long getNumberOfWaitingApplications() {\n return numberOfWaitingApplications;\n}\n",[2721,5931,5932,5937,5942,5947],{"__ignoreMap":11},[1732,5933,5934],{"class":3115,"line":3116},[1732,5935,5936],{},"@ManagedAttribute(description = \"Get the number of all waiting applications\" )\n",[1732,5938,5939],{"class":3115,"line":12},[1732,5940,5941],{},"public long getNumberOfWaitingApplications() {\n",[1732,5943,5944],{"class":3115,"line":186},[1732,5945,5946],{}," return numberOfWaitingApplications;\n",[1732,5948,5949],{"class":3115,"line":3141},[1732,5950,5453],{},[47,5952,5953],{},"Exposing attributes may be:",[889,5955,5956,5959,5962,5965,5968,5971,5974],{},[892,5957,5958],{},"Basic types",[892,5960,5961],{},"Primitives and their wrappers",[892,5963,5964],{},"String",[892,5966,5967],{},"BigDecimal",[892,5969,5970],{},"BigInteger",[892,5972,5973],{},"Date",[892,5975,5976],{},"Arrays and collections of basic types",[47,5978,5979],{},[67,5980,5981],{},"2.2 Methods",[47,5983,5984,5985,177],{},"Annotate each method you wish to expose with ",[132,5986,5880],{},[3106,5988,5990],{"className":5429,"code":5989,"language":5431,"meta":11,"style":11},"@ManagedOperation(description = \"Shows a list of all waiting applications with some information.\")\npublic List\u003CString> showWaitingApplications() {\n // do something and return a list of all waiting applications\n}\n",[2721,5991,5992,5997,6002,6007],{"__ignoreMap":11},[1732,5993,5994],{"class":3115,"line":3116},[1732,5995,5996],{},"@ManagedOperation(description = \"Shows a list of all waiting applications with some information.\")\n",[1732,5998,5999],{"class":3115,"line":12},[1732,6000,6001],{},"public List\u003CString> showWaitingApplications() {\n",[1732,6003,6004],{"class":3115,"line":186},[1732,6005,6006],{}," // do something and return a list of all waiting applications\n",[1732,6008,6009],{"class":3115,"line":3141},[1732,6010,5453],{},[47,6012,6013,6014,177],{},"If your methods have parameters you can describe them further with ",[132,6015,6016],{},"@ManagedOperationParameters",[3106,6018,6020],{"className":5429,"code":6019,"language":5431,"meta":11,"style":11},"@ManagedOperation(description = \"Get the number of all applications that have the given status.\")\n@ManagedOperationParameters({\n @ManagedOperationParameter(name = \"status\", description = \"The status may be waiting, allowed, rejected or cancelled.\")\n})\npublic long countApplicationsInStatus(String state) {\n // do something and return number of applications with the given status\n}\n",[2721,6021,6022,6027,6032,6037,6042,6047,6052],{"__ignoreMap":11},[1732,6023,6024],{"class":3115,"line":3116},[1732,6025,6026],{},"@ManagedOperation(description = \"Get the number of all applications that have the given status.\")\n",[1732,6028,6029],{"class":3115,"line":12},[1732,6030,6031],{},"@ManagedOperationParameters({\n",[1732,6033,6034],{"class":3115,"line":186},[1732,6035,6036],{}," @ManagedOperationParameter(name = \"status\", description = \"The status may be waiting, allowed, rejected or cancelled.\")\n",[1732,6038,6039],{"class":3115,"line":3141},[1732,6040,6041],{},"})\n",[1732,6043,6044],{"class":3115,"line":3196},[1732,6045,6046],{},"public long countApplicationsInStatus(String state) {\n",[1732,6048,6049],{"class":3115,"line":3202},[1732,6050,6051],{}," // do something and return number of applications with the given status\n",[1732,6053,6054],{"class":3115,"line":3212},[1732,6055,5453],{},[47,6057,6058,6059,6061,6062,6064],{},"Make sure to annotate your Getter/Setter with ",[132,6060,5876],{}," and not with ",[132,6063,5880],{},". Otherwise your\nmethods won’t work.",[81,6066,6068],{"id":6067},"_3-try-it","3. Try it!",[47,6070,6071],{},"You can now use the functions of your MBean either with JConsole or with other tools. (e.g. JMinix)",[47,6073,6074],{},[67,6075,6076],{},"3.1 JConsole",[47,6078,6079],{},"JConsole is part of Oracle’s JDK, so you can just start it by executing the JConsole command in your JDK’s\nbinary-folder. You can connect to local or to remote Java Virtual Machines. If you are running your application on the\nsame host as JConsole it should show up at the ‘Local Process’ section.",[47,6081,6082],{},[94,6083],{"alt":6084,"src":6085},"\"jconsole\"","https://media.synyx.de/uploads//2012/04/jconsole.png",[47,6087,6088],{},[67,6089,6090],{},"3.2 JMinix",[47,6092,6093],{},"If you want to have a JMX entry point in your web application instead of using JConsole, JMinix might be the right\nchoice for you.",[47,6095,6096],{},[94,6097],{"alt":6098,"src":6099},"\"JMinix\"","https://media.synyx.de/uploads//2012/04/jminix.png",[47,6101,6102],{},"You can include it easily in your Maven based web application:",[47,6104,6105],{},"Add JMinix as dependency in your pom.xml",[3106,6107,6109],{"className":5392,"code":6108,"language":5394,"meta":11,"style":11},"\n\u003Cdependency>\n \u003CgroupId>org.jminix\u003C/groupId>\n \u003CartifactId>jminix\u003C/artifactId>\n \u003Cversion>1.0.0\u003C/version>\n\u003C/dependency>\n",[2721,6110,6111,6115,6120,6125,6130,6135],{"__ignoreMap":11},[1732,6112,6113],{"class":3115,"line":3116},[1732,6114,3119],{"emptyLinePlaceholder":28},[1732,6116,6117],{"class":3115,"line":12},[1732,6118,6119],{},"\u003Cdependency>\n",[1732,6121,6122],{"class":3115,"line":186},[1732,6123,6124],{}," \u003CgroupId>org.jminix\u003C/groupId>\n",[1732,6126,6127],{"class":3115,"line":3141},[1732,6128,6129],{}," \u003CartifactId>jminix\u003C/artifactId>\n",[1732,6131,6132],{"class":3115,"line":3196},[1732,6133,6134],{}," \u003Cversion>1.0.0\u003C/version>\n",[1732,6136,6137],{"class":3115,"line":3202},[1732,6138,6139],{},"\u003C/dependency>\n",[47,6141,6142],{},"JMinix uses a simple HttpServlet that you have to register and map to an url-pattern in your web.xml",[3106,6144,6146],{"className":5392,"code":6145,"language":5394,"meta":11,"style":11},"\u003C!-- JMX -->\n\u003Cservlet>\n \u003Cservlet-name>JmxMiniConsoleServlet\u003C/servlet-name>\n \u003Cservlet-class>org.jminix.console.servlet.MiniConsoleServlet\u003C/servlet-class>\n\u003C/servlet>\n\u003Cservlet-mapping>\n\u003Cservlet-name>JmxMiniConsoleServlet\u003C/servlet-name>\n\u003Curl-pattern>/jmx/*\u003C/url-pattern>\n\u003C/servlet-mapping>\n",[2721,6147,6148,6153,6158,6163,6168,6173,6178,6183,6188],{"__ignoreMap":11},[1732,6149,6150],{"class":3115,"line":3116},[1732,6151,6152],{},"\u003C!-- JMX -->\n",[1732,6154,6155],{"class":3115,"line":12},[1732,6156,6157],{},"\u003Cservlet>\n",[1732,6159,6160],{"class":3115,"line":186},[1732,6161,6162],{}," \u003Cservlet-name>JmxMiniConsoleServlet\u003C/servlet-name>\n",[1732,6164,6165],{"class":3115,"line":3141},[1732,6166,6167],{}," \u003Cservlet-class>org.jminix.console.servlet.MiniConsoleServlet\u003C/servlet-class>\n",[1732,6169,6170],{"class":3115,"line":3196},[1732,6171,6172],{},"\u003C/servlet>\n",[1732,6174,6175],{"class":3115,"line":3202},[1732,6176,6177],{},"\u003Cservlet-mapping>\n",[1732,6179,6180],{"class":3115,"line":3212},[1732,6181,6182],{},"\u003Cservlet-name>JmxMiniConsoleServlet\u003C/servlet-name>\n",[1732,6184,6185],{"class":3115,"line":3346},[1732,6186,6187],{},"\u003Curl-pattern>/jmx/*\u003C/url-pattern>\n",[1732,6189,6190],{"class":3115,"line":3357},[1732,6191,6192],{},"\u003C/servlet-mapping>\n",[81,6194,6196],{"id":6195},"_4-notifications","4. Notifications",[47,6198,6199],{},"Notifications (javax.management.Notification) can be broadcast from your component to notify about something interesting\nhappening. This is only a simple example of using Notifications.",[47,6201,6202],{},"Example: You want to be notified if a user logs in.",[3106,6204,6206],{"className":5429,"code":6205,"language":5431,"meta":11,"style":11},"@ManagedResource(objectName = \"mbeans:name=myJmxDemoBean\", description = \"Manage some 'Urlaubsverwaltung' problems.\")\npublic class JmxDemoReady implements NotificationPublisherAware {\n // lot of stuff\n private NotificationPublisher notificationPublisher;\n public void notifyAboutLogin(String msg) {\n notificationPublisher.sendNotification(new Notification(\"Login Action\", this, 0, msg));\n }\n @Override\n public void setNotificationPublisher(NotificationPublisher notificationPublisher) {\n this.notificationPublisher = notificationPublisher;\n }\n}\n",[2721,6207,6208,6213,6218,6222,6227,6232,6237,6241,6246,6251,6256,6260],{"__ignoreMap":11},[1732,6209,6210],{"class":3115,"line":3116},[1732,6211,6212],{},"@ManagedResource(objectName = \"mbeans:name=myJmxDemoBean\", description = \"Manage some 'Urlaubsverwaltung' problems.\")\n",[1732,6214,6215],{"class":3115,"line":12},[1732,6216,6217],{},"public class JmxDemoReady implements NotificationPublisherAware {\n",[1732,6219,6220],{"class":3115,"line":186},[1732,6221,5909],{},[1732,6223,6224],{"class":3115,"line":3141},[1732,6225,6226],{}," private NotificationPublisher notificationPublisher;\n",[1732,6228,6229],{"class":3115,"line":3196},[1732,6230,6231],{}," public void notifyAboutLogin(String msg) {\n",[1732,6233,6234],{"class":3115,"line":3202},[1732,6235,6236],{}," notificationPublisher.sendNotification(new Notification(\"Login Action\", this, 0, msg));\n",[1732,6238,6239],{"class":3115,"line":3212},[1732,6240,5706],{},[1732,6242,6243],{"class":3115,"line":3346},[1732,6244,6245],{}," @Override\n",[1732,6247,6248],{"class":3115,"line":3357},[1732,6249,6250],{}," public void setNotificationPublisher(NotificationPublisher notificationPublisher) {\n",[1732,6252,6253],{"class":3115,"line":3363},[1732,6254,6255],{}," this.notificationPublisher = notificationPublisher;\n",[1732,6257,6258],{"class":3115,"line":3369},[1732,6259,5706],{},[1732,6261,6262],{"class":3115,"line":3384},[1732,6263,5453],{},[47,6265,6266],{},"With the NotificationPublisher you are able to create Notifications in a very simple way. At the right place in your\ncode, you inject your JmxDemo Bean and call the method notifyAboutLogin() when a user logs in. JConsole now displays a\nthird menu item called ‘Notifications’, besides ‘Attributes’ and ‘Operations’. If you click on ‘Subscribe’, you get a\nNotification every time a user logs in your web application.",[81,6268,6270],{"id":6269},"_5-further-information","5. Further information:",[47,6272,6273],{},[51,6274,5623],{"href":6275,"rel":6276},"http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jmx.html",[55],[47,6278,6279],{},[51,6280,6283],{"href":6281,"rel":6282},"http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html",[55],"About JConsole",[47,6285,6286],{},[51,6287,6290],{"href":6288,"rel":6289},"http://code.google.com/p/jminix/",[55],"About JMinix",[47,6292,6293],{},[51,6294,6297],{"href":6295,"rel":6296},"http://blog.synyx.de/2011/11/elektronische-urlaubsverwaltung-made-by-youngsters",[55],"About the vacation management web application",[5170,6299,5626],{},{"title":11,"searchDepth":12,"depth":12,"links":6301},[6302,6303,6304,6305,6306],{"id":5758,"depth":186,"text":5759},{"id":5865,"depth":186,"text":5866},{"id":6067,"depth":186,"text":6068},{"id":6195,"depth":186,"text":6196},{"id":6269,"depth":186,"text":6270},[2986,5192],"2012-05-07T17:56:12","JMX (Java Management Extensions) provides the infrastructure to support monitoring and management of your Java\\napplications. Resources you manage with JMX are called Managed Beans (MBeans). I want to show you how to quickly\\nregister your own Service as MBean using Spring and Source-Level Metadata (JDK 5.0+ annotations).","https://synyx.de/blog/how-to-monitor-and-manage-your-java-application-with-jmx/",{},"/blog/how-to-monitor-and-manage-your-java-application-with-jmx",{"title":5652,"description":5661},"blog/how-to-monitor-and-manage-your-java-application-with-jmx",[6316,6317,6318,6319,6320,6321,6322,5646],"annotation","jconsole","jminix","jmx","mbeans","metadata","notifications","JMX (Java Management Extensions) provides the infrastructure to support monitoring and management of your Java applications. Resources you manage with JMX are called Managed Beans (MBeans). I want to show…","Lf-pqL8fxMUtFEesPQZ2fYbpNoUAqH8DOQaGCkCDsBA",{"id":6326,"title":6327,"author":6328,"body":6329,"category":6448,"date":6449,"description":6450,"extension":17,"link":6451,"meta":6452,"navigation":28,"path":6453,"seo":6454,"slug":6333,"stem":6455,"tags":6456,"teaser":6461,"__hash__":6462},"blog/blog/elektronische-urlaubsverwaltung-made-by-youngsters.md","Elektronische Urlaubsverwaltung made by Youngsters",[32],{"type":8,"value":6330,"toc":6446},[6331,6334,6337,6340,6343,6348,6351,6354,6357,6360,6363,6383,6386,6389,6392,6395,6398,6401,6404,6407,6410,6416,6419,6422,6425,6428,6431,6434,6437,6440,6443],[43,6332,6327],{"id":6333},"elektronische-urlaubsverwaltung-made-by-youngsters",[47,6335,6336],{},"Für die erfolgreiche Genehmigung von Urlaub muss der synyx’sche Mitarbeiter sich bisher mit einem Stück Papier alias\n‘schriftlich ausgefüllter Urlaubsantrag’ bewaffnen und sich an einen der drei Chefs anpirschen, um eine Unterschrift zu\nergattern.",[47,6338,6339],{},"Dies ist nicht nur zeitaufwändig, sondern auch einfach nicht zeitgemäß für eine junge Software-Schmiede wie Synyx.",[47,6341,6342],{},"So erhielten Johannes Reuter (Studentische Hilfskraft seit 1. August 2011) und ich, Aljona Murygina (Auszubildende zur\nFachinformatikerin seit 1. August 2011), den Auftrag, das ganze Prozedere zu modernisieren, wir befinden uns\nschließlich im Jahr 2011:",[47,6344,6345],{},[67,6346,6347],{},"Ein Urlaubsverwaltungs-Tool als Webapplikation muss her.",[47,6349,6350],{},"Als Grundgerüst der Applikation wurden drei verschiedene Arten von Usern festgelegt:",[47,6352,6353],{},"der normale User (Antragssteller: Urlaub beantragen),",[47,6355,6356],{},"der Chef (Vergabeberechtigter: Urlaubsantrag genehmigen/ablehnen) und",[47,6358,6359],{},"das Office (eine Art Super-User mit Verwaltungs- und Editierfunktion: Urlaubsantrag bearbeiten).",[47,6361,6362],{},"Essentielle Grundfunktionen des Urlaubsverwaltungs-Tool sollen sein:",[889,6364,6365,6368,6371,6374,6377,6380],{},[892,6366,6367],{},"Die Authentifizierung soll mittels bereits vorhandenen LDAP-Benutzerdaten der Mitarbeiter erfolgen.",[892,6369,6370],{},"Urlaubsanträge sollen digital validiert werden, das heißt Antragssteller und Antraggenehmigender müssen jeweils über\neinen einzigartigen Identifikationsnachweis (‘digitale Unterschrift’) verfügen.",[892,6372,6373],{},"Eine Interaktion mit dem firmeninternen Google-Kalender soll für automatisierte Übersichtlichkeit sorgen, welche\nMitarbeiter in welchem Zeitraum im Urlaub sind.",[892,6375,6376],{},"Transparenz ist die Quintessenz einer Open Source Firma und hört auch nicht bei firmeninternen Vorgängen auf. Daher\nsollen jegliche Schritte der Bearbeitung von Anträgen durch eine Log-Datei nachvollziehbar sein können.",[892,6378,6379],{},"Via E-Mail sollen die jeweils Beteiligten über den laufenden Antragsvorgang informiert werden, ob zum Beispiel ein\nneuer zu genehmigender Antrag vorliegt oder ein Antrag genehmigt wurde.",[892,6381,6382],{},"Urlaubstage per Hand abzuzählen ist ziemlich retro, weshalb im digitalen Urlaubsantrag nur noch via Datumseingabe ein\nZeitraum angegeben werden soll. Über einen Feiertagskalender berechnet dann die Applikation statt der Antragssteller,\nwie viele Urlaubstage netto für diesen Zeitraum vom Urlaubskonto des Mitarbeiters abgezogen werden.",[47,6384,6385],{},"Was die programmatischen Werkzeuge betrifft, wurde uns freie Hand gelassen.",[47,6387,6388],{},"Wir entschieden uns, den Kern des Tools in Java zu schreiben und für die ‘äußere Hülle’ der Webapplikation das Framework\nSpring MVC zu benutzen.",[47,6390,6391],{},"Zunächst erschien uns der Arbeitsauftrag ziemlich trivial.",[47,6393,6394],{},"Bei der Konzeption des Tools allerdings stießen wir doch schnell an einige Stolpersteine.",[47,6396,6397],{},"Zu nennen wäre hier beispielsweise:",[47,6399,6400],{},"Die LDAP-Authentifizierung erschien auf den ersten Blick einfacher, bis wir feststellten, was für ein komplexes und\nweites Feld Spring Security eigentlich darstellt.",[47,6402,6403],{},"Bei der digitalen Validierung wechselten wir mehrmals unsere Meinung. Zur Auswahl verfügbar wäre erstens ein Photo der\neigenen Unterschrift, verknüpft mit der jeweiligen Person, oder zweitens die Signatur mittels eines persönlichen\nPGP-Schlüssels. (momentan favorisieren wir letztere Möglichkeit)",[47,6405,6406],{},"Auch die Interaktion mit einem Google-Kalender ist ein Feld, in das es sich noch einzulesen gilt.",[47,6408,6409],{},"Den inneren Kern unseres Tools, die Domain-Objekte, haben wir nun letztendlich in die Klassen Antrag, Person,\nUrlaubsanspruch und Urlaubskonto gegliedert.",[47,6411,6412],{},[94,6413],{"alt":6414,"src":6415},"\"Domainobjekte\"","https://media.synyx.de/uploads//2011/11/Domainobjekte1.png",[47,6417,6418],{},"Als formelle Stolpersteine bei der Konzeption und Implementierung der Domain-Objekte und Services erwies sich die\nUnterscheidung in ‘normalen’ Urlaub und Resturlaub.",[47,6420,6421],{},"Resturlaub ist übrig gebliebener Jahresurlaub aus dem vorherigen Jahr, den ein Mitarbeiter mit ins neue Jahr nimmt.",[47,6423,6424],{},"Zwei wichtige Daten sind also der 1. Januar und der 1. April.",[47,6426,6427],{},"Am 1. Januar wird aus dem verbliebenem Urlaub des vorigen Jahres Resturlaub, während am 1. April dieser Resturlaub\nverfällt.",[47,6429,6430],{},"Wenn der Urlaubszeitraum also über einen dieser beiden Termine fällt (z.B. Urlaub vom 25.03. – 04.04.), erfordert\ndie Berechnung des Urlaubskontos des Mitarbeiters eine besondere Logik.",[47,6432,6433],{},"Die entsprechenden Services (AntragService, PersonService, UrlaubskontoService) sind großteils schon ausimplementiert,\njedoch ergeben sich aufgrund der Herausforderung der besonderen datumsabhängigen Logik immer wieder Veränderungen im\nCode.",[47,6435,6436],{},"Der MailService ist bisher gelöst mit dem JavaMailSender und MimeMessagePreparator (\norg.springframework.mail.javamail.*), benötigt sicherlich jedoch auch noch eine Überarbeitung der genauen Details.",[47,6438,6439],{},"Controller und die zugehörigen JSPs sind ebenfalls bereits großteils funktionsfähig, z.B. Darstellung von Mitarbeiter-\noder Antragslisten (zum Beispiel nach Status, Person, Datum), Formular zur Antragsstellung.",[47,6441,6442],{},"Das Design betreffend (z.B. dynamische Menü-Navigation oder Kalenderdarstellung ‘DatePicker’) werden wir aller\nWahrscheinlichkeit nach zu Bibliotheken von jQuery greifen.",[47,6444,6445],{},"Bevor wir allerdings überhaupt an das i-Tüpfelchen Design denken können, haben wir noch einen langen Weg vor uns….",{"title":11,"searchDepth":12,"depth":12,"links":6447},[],[2986],"2011-11-07T20:13:06","Für die erfolgreiche Genehmigung von Urlaub muss der synyx’sche Mitarbeiter sich bisher mit einem Stück Papier alias\\n‘schriftlich ausgefüllter Urlaubsantrag’ bewaffnen und sich an einen der drei Chefs anpirschen, um eine Unterschrift zu\\nergattern.","https://synyx.de/blog/elektronische-urlaubsverwaltung-made-by-youngsters/",{},"/blog/elektronische-urlaubsverwaltung-made-by-youngsters",{"title":6327,"description":6336},"blog/elektronische-urlaubsverwaltung-made-by-youngsters",[6457,6458,6459,1181,2697,1183,6460],"ausbildung","azubi-2","spring-mvc","webapplikation","Für die erfolgreiche Genehmigung von Urlaub muss der synyx’sche Mitarbeiter sich bisher mit einem Stück Papier alias ‘schriftlich ausgefüllter Urlaubsantrag’ bewaffnen und sich an einen der drei Chefs anpirschen, um…","Iciij-U2SfXBfMkPBt4jEMrE_4Z6koLV-sClbDtNMa0",{"id":6464,"title":6465,"author":6466,"body":6467,"category":6514,"date":6515,"description":6516,"extension":17,"link":6517,"meta":6518,"navigation":28,"path":6519,"seo":6520,"slug":6521,"stem":6522,"tags":6523,"teaser":6525,"__hash__":6526},"blog/blog/sommerfeier-bei-synyx-eine-nasse-angelegenheit-2.md","Sommerfeier bei Synyx – eine nasse Angelegenheit",[32],{"type":8,"value":6468,"toc":6512},[6469,6472,6481,6484,6489,6492,6495,6498,6503,6506,6509],[43,6470,6465],{"id":6471},"sommerfeier-bei-synyx-eine-nasse-angelegenheit",[47,6473,6474,6478],{},[94,6475],{"alt":6476,"src":6477},"\"Kanu fahren\"","https://media.synyx.de/uploads//2011/08/kanu.jpg",[132,6479,6480],{},"Nicht nur der diesjährige Sommer hat uns oft nasse Bescherung von oben geboten, auch die Sommerfeierei bei Synyx stand\ndieses Jahr ganz im Zeichen des Wassers. Ausflugsziel war nämlich der Altrhein – und zwar nicht zum gemächlichen\nEntenfüttern, sondern zum rasanten Kanufahren in den Stromschnellen des Altrheins.",[47,6482,6483],{},"Für die Meisten war der Startpunkt 13 Uhr im Büro, um sich mit sprudelndem Proviant einzudecken; so eine Kanufahrt macht\nschließlich durstig. Mit der Bahn ging es dann ans Ende der Welt, nach Rappenwörth, wo der Rest der Paddelwilligen zu\nuns stieß. Eine Prise Verwirrung und Ratlosigkeit später („Wo ist denn dieser Kanuverleih überhaupt?“) war unsere Suche\ndoch noch erfolgreich. Wir teilten uns in Zweier- und Dreiergruppen auf und wurden mit Kanus ausgestattet, die wir ans\nUfer hievten, um in See zu stechen. Eines der Kanus bildete sich wohl ein, ein U-Boot zu sein, was zur Folge hatte,\ndass Markus als Erster bis zum Bauch im Wasser stand. Rebecca, ihr Mann und ich sollten das allerdings noch toppen. Denn\nwir fielen beim Einsteigen gleich kopfüber ins Wasser, als unser Kanu kenterte. Zunächst einmal gab es keine weiteren\nOpfer zu beklagen und es hieß für alle: „Volle Fahrt voraus!“.",[47,6485,6486],{},[67,6487,6488],{},"Natürlich wäre gesittetes Benehmen auf dem Kanu viel zu langweilig, weshalb der Altrhein spontan zu einem\nWasserschlachtfeld erklärt wurde.",[47,6490,6491],{},"Feuer lässt sich vielleicht nicht mit Feuer bekämpfen, aber Wasser mit Wasser. Wir lernten schnell, dass sich ein Paddel\nnicht nur zum Paddeln eignet, sondern auch ein sehr effektives Werkzeug zur Bewässerung anderer Kanus und der\nzugehörigen Crew darstellt. Man munkelt, dass das Admin-Kanu noch viel schärfere Geschütze aufgefahren hatte, wie z.B.\nWasserpistolen und Wasserbomben; und ein Megafon hatte wohl sonst auch kein anderes Kanu mit an Bord.",[47,6493,6494],{},"Während der ereignisreichen Seeschlachten hieß es für manche Besatzung leider auch mal: „Mann/Frau über Bord!“ Es steht\nimmer noch Aussage gegen Aussage, wer denn wirklich schuld war am Kentern des Kanus von Thomas, Florian und Lianna; es\ngibt da verschiedene Versionen der Geschichte. Was allerdings sicher feststeht, ist, dass die erwähnten Wasserratten nur\ndurch die Großherzigkeit anderer Besatzungen (anzuführen wären hier das Junggesellen-Kanu, das Admin-Kanu und\nunsereins) gerettet werden konnten – und das gleich zwei Mal innerhalb weniger Minuten.",[47,6496,6497],{},"Während der Fahrt ereilte uns auch tatsächlich noch der angekündigte Regenschauer. Allerdings störte dieser nicht\nweiter, da man ja durch all den Schabernack sowieso schon nass war.",[47,6499,6500],{},[67,6501,6502],{},"Nach circa zweieinhalb Stunden Seeschlacht auf dem Altrhein hatten die vor Brackwasser triefenden Synyx-Piraten\nendlich wieder festen Boden unter den Füßen.",[47,6504,6505],{},"Ein wenig erschöpft und hungrig kehrte man bei den Rheinbrüdern ein. Dort standen schon die Kaltgetränke bereit, während\nder Grill gerade angeschmissen wurde. Neben dem Grillgut hatte das Buffet auch eine Vegetarier-freundliche Auswahl an\nSalaten und Antipasti zu bieten. Als kleines i-Tüpfelchen gab es zum Nachtisch dann noch Kuchen und Eis.",[47,6507,6508],{},"Es wurde reichlich gespeist und getrunken, Seemannsgarn ausgetauscht und miteinander gelacht bis in den Morgen hinein. (\ndie Letzten räumten das Feld gegen drei Uhr früh)",[47,6510,6511],{},"Alles in allem war die Sommerfeier (die gleichzeitig meine erste Feier bei Synyx war) genauso nass wie gelungen, was\nschon viel Vorfreude auf die nächsten Feiern macht.",{"title":11,"searchDepth":12,"depth":12,"links":6513},[],[194],"2011-08-16T13:16:01","Nicht nur der diesjährige Sommer hat uns oft nasse Bescherung von oben geboten, auch die Sommerfeierei bei Synyx stand\\ndieses Jahr ganz im Zeichen des Wassers. Ausflugsziel war nämlich der Altrhein – und zwar nicht zum gemächlichen\\nEntenfüttern, sondern zum rasanten Kanufahren in den Stromschnellen des Altrheins.","https://synyx.de/blog/sommerfeier-bei-synyx-eine-nasse-angelegenheit-2/",{},"/blog/sommerfeier-bei-synyx-eine-nasse-angelegenheit-2",{"title":6465,"description":6480},"sommerfeier-bei-synyx-eine-nasse-angelegenheit-2","blog/sommerfeier-bei-synyx-eine-nasse-angelegenheit-2",[6524,1181],"feier","Nicht nur der diesjährige Sommer hat uns oft nasse Bescherung von oben geboten, auch die Sommerfeierei bei Synyx stand dieses Jahr ganz im Zeichen des Wassers. Ausflugsziel war nämlich der…","uJimB3fTqYzOn4piT2m5_9EK72whVyWNEtrG0jdVEHI",["Reactive",6528],{"$scookieConsent":6529,"$ssite-config":6531},{"functional":6530,"analytics":6530},false,{"_priority":6532,"env":6536,"name":6537,"url":6538},{"name":6533,"env":6534,"url":6535},-10,-15,0,"production","nuxt-app","https://synyx.de",["Set"],["ShallowReactive",6541],{"author-buchloh":-1,"roughlyFilteredArticles":-1},"/blog/author/buchloh"]