<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>SmoggIT</title><description>Блог SmoggIT`a - IT in the smog</description><managingEditor>noreply@blogger.com (SmoggIT)</managingEditor><pubDate>Sat, 5 Oct 2024 07:36:24 +0500</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">6</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://smoggit.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle>Блог SmoggIT`a - IT in the smog</itunes:subtitle><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>Groovy как скриптовый язык и DSL для Java</title><link>http://smoggit.blogspot.com/2012/06/groovy-dsl-java.html</link><author>noreply@blogger.com (SmoggIT)</author><pubDate>Mon, 11 Jun 2012 21:29:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-3957672332494768560</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto;"&gt;Мой первый хабрапост&amp;nbsp;&lt;/span&gt;&lt;a class="twitter-timeline-link" data-expanded-url="http://habr.ru/p/145138/" data-ultimate-url="http://habrahabr.ru/post/145138" href="http://t.co/ZtLB3zT2" rel="nofollow" style="background-color: white; color: #0084b4; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; outline: 0px; text-align: -webkit-auto; text-decoration: none;" target="_blank" title="http://habr.ru/p/145138/"&gt;http://habr.ru/p/145138/&lt;/a&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto;"&gt;&amp;nbsp;Groovy как скриптовый язык и DSL для Java...&lt;/span&gt;&lt;span class="fullpost"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;span style="color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 18px;"&gt;Читайте )&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Использование Spring и IBM Websphere MQ в Java приложениях</title><link>http://smoggit.blogspot.com/2009/10/spring-websphere-mq-java.html</link><category>java</category><category>JMS</category><category>maven</category><category>Spring</category><category>Websphere MQ</category><author>noreply@blogger.com (SmoggIT)</author><pubDate>Sun, 4 Oct 2009 17:38:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-2493704288026042156</guid><description>&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; (Spring Framework)&amp;#160; - open source фреймворк для разработки приложений на Java. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www-01.ibm.com/software/integration/wmq/"&gt;IBM Websphere MQ&lt;/a&gt;&amp;#160; (MQSeries) - коммерческий продукт всем известной компании IBM для обмена сообщениями. &lt;/p&gt;  &lt;p&gt;Данный текст в основном предназначен для разработчиков приложений на базе Spring и интересующимися&amp;#160; асинхронными средствами обмена.&lt;/p&gt;  &lt;p&gt;Будем рассматривать отправку и прием сообщений из Websphere&amp;#160; MQ средствами &lt;a href="http://static.springsource.org/spring/docs/2.5.x/reference/jms.html"&gt;Spring-Jms&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;1. Создадим пустой &lt;a href="http://smoggit.blogspot.com/search/label/maven"&gt;maven &lt;/a&gt;проект spring-mq. Структура проекта будет следующей:&lt;br /&gt;&lt;p&gt;spring-mq\src\      &lt;br /&gt;spring-mq\src\main\       &lt;br /&gt;spring-mq\src\main\java\       &lt;br /&gt;spring-mq\src\main\resources\       &lt;br /&gt;spring-mq\src\test\       &lt;br /&gt;spring-mq\src\test\java\       &lt;br /&gt;spring-mq\src\test\resources\       &lt;br /&gt;spring-mq\pom.xml&lt;/p&gt;    &lt;p&gt;2. В файле pom.xml&amp;#160; вы должны прописать зависимости к проектам spring-context, spring-jms, spring-test версий 2.5.5, jms 1.1, junit 4.4&amp;#160; и&amp;#160; к библиотекам ibm mqjms&amp;#160; и&amp;#160; dhbcore версии, соответствующей версии установленной у вас Websphere MQ (соответствие необязательно, если вы будете использовать клиентские соединения, см. далее). &lt;/p&gt;    &lt;p&gt;Так как java библиотеки для MQ не выложены в репозиториях maven, вам это придется сделать самим, выложив их в свой локальный репозиторий. Библиотеки для MQ 5 и 6, сконфигурированные для maven можно &lt;a href="http://smoggit.net.ru/download/blog/libs/ibm-mq-maven-libs.zip "&gt;здесь&lt;/a&gt; (4,3Мб) и распаковать их в каталог $maven_repository/com/ibm вашего репозитория .&lt;/p&gt;    &lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;&lt;br /&gt; &amp;lt;modelVersion&gt;4.0.0&amp;lt;/modelVersion&gt;&lt;br /&gt; &amp;lt;groupId&gt;com.smogg.samples&amp;lt;/groupId&gt;&lt;br /&gt; &amp;lt;artifactId&gt;spring-mq&amp;lt;/artifactId&gt;&lt;br /&gt; &amp;lt;version&gt;1.0&amp;lt;/version&gt;&lt;br /&gt; &amp;lt;name&gt;Spring with Websphere MQ sample&amp;lt;/name&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;build&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;plugins&gt;&lt;br /&gt;   &amp;lt;plugin&gt;&lt;br /&gt;    &amp;lt;artifactId&gt;maven-compiler-plugin&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;configuration&gt;&lt;br /&gt;     &amp;lt;source&gt;1.5&amp;lt;/source&gt;&lt;br /&gt;     &amp;lt;target&gt;1.5&amp;lt;/target&gt;&lt;br /&gt;     &amp;lt;encoding&gt;UTF-8&amp;lt;/encoding&gt;&lt;br /&gt;    &amp;lt;/configuration&gt;&lt;br /&gt;   &amp;lt;/plugin&gt;&lt;br /&gt;  &amp;lt;/plugins&gt;&lt;br /&gt; &amp;lt;/build&gt;&lt;br /&gt; &amp;lt;dependencies&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;spring-context&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;2.5.5&amp;lt;/version&gt;&lt;br /&gt;   &amp;lt;exclusions&gt;&lt;br /&gt;    &amp;lt;exclusion&gt;&lt;br /&gt;     &amp;lt;groupId&gt;log4j&amp;lt;/groupId&gt;&lt;br /&gt;     &amp;lt;artifactId&gt;log4j&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;/exclusion&gt;&lt;br /&gt;    &amp;lt;exclusion&gt;&lt;br /&gt;     &amp;lt;groupId&gt;javax.servlet&amp;lt;/groupId&gt;&lt;br /&gt;     &amp;lt;artifactId&gt;servlet-api&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;/exclusion&gt;&lt;br /&gt;    &amp;lt;exclusion&gt;&lt;br /&gt;     &amp;lt;groupId&gt;logkit&amp;lt;/groupId&gt;&lt;br /&gt;     &amp;lt;artifactId&gt;logkit&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;/exclusion&gt;&lt;br /&gt;    &amp;lt;exclusion&gt;&lt;br /&gt;     &amp;lt;groupId&gt;avalon-framework&amp;lt;/groupId&gt;&lt;br /&gt;     &amp;lt;artifactId&gt;avalon-framework&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;/exclusion&gt;&lt;br /&gt;   &amp;lt;/exclusions&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;spring-jms&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;2.5.5&amp;lt;/version&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;javax.jms&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;jms&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;1.1&amp;lt;/version&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;spring-test&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;2.5.5&amp;lt;/version&gt;&lt;br /&gt;   &amp;lt;scope&gt;test&amp;lt;/scope&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;junit&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;junit&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;4.4&amp;lt;/version&gt;&lt;br /&gt;   &amp;lt;scope&gt;test&amp;lt;/scope&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;com.ibm&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;com.ibm.mqjms&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;6.0.2.5&amp;lt;/version&gt;&lt;br /&gt;   &amp;lt;exclusions&gt;&lt;br /&gt;    &amp;lt;exclusion&gt;&lt;br /&gt;     &amp;lt;groupId&gt;javax.naming&amp;lt;/groupId&gt;&lt;br /&gt;     &amp;lt;artifactId&gt;jndi&amp;lt;/artifactId&gt;&lt;br /&gt;    &amp;lt;/exclusion&gt;&lt;br /&gt;   &amp;lt;/exclusions&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;&lt;br /&gt;  &amp;lt;dependency&gt;&lt;br /&gt;   &amp;lt;groupId&gt;com.ibm&amp;lt;/groupId&gt;&lt;br /&gt;   &amp;lt;artifactId&gt;com.ibm.dhbcore&amp;lt;/artifactId&gt;&lt;br /&gt;   &amp;lt;version&gt;6.0.2.5&amp;lt;/version&gt;&lt;br /&gt;  &amp;lt;/dependency&gt;  &lt;br /&gt; &amp;lt;/dependencies&gt;&lt;br /&gt;&amp;lt;/project&gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. &lt;strong&gt;Отправка сообщений&lt;/strong&gt;. Создадим класс JMSSender в папке main/java пакете com.smogg.samples.springmq, который будет отправлять сообщения посредством JMS.&amp;#160;&amp;#160; Код практически аналогичен коду, приведенному в документации по &lt;a href="http://static.springsource.org/spring/docs/2.5.x/reference/jms.html"&gt;Spring-JMS&lt;/a&gt; (п 19.3)&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;package com.smogg.samples.springmq;&lt;br /&gt;&lt;br /&gt;import javax.jms.BytesMessage;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;import javax.jms.Message;&lt;br /&gt;import javax.jms.Session;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.factory.annotation.Required;&lt;br /&gt;import org.springframework.jms.core.JmsTemplate;&lt;br /&gt;import org.springframework.jms.core.MessageCreator;&lt;br /&gt;&lt;br /&gt;public class JMSSender {&lt;br /&gt; private JmsTemplate jmsTemplate;&lt;br /&gt; public void sendMesage(final byte[] mess) {&lt;br /&gt;  System.out.println(&amp;quot;Send message...&amp;quot;);&lt;br /&gt;  jmsTemplate.send(new MessageCreator() {&lt;br /&gt;   public Message createMessage(Session session) throws JMSException {&lt;br /&gt;    BytesMessage byteMess = session.createBytesMessage();&lt;br /&gt;    byteMess.writeBytes(mess);&lt;br /&gt;    return byteMess;&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public JmsTemplate getJmsTemplate() {&lt;br /&gt;  return jmsTemplate;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Required&lt;br /&gt; public void setJmsTemplate(JmsTemplate jmsTemplate) {&lt;br /&gt;  this.jmsTemplate = jmsTemplate;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;4. Настроим получателя сообщений посредством xml конфигурации – нужно будет определить ConnectoinFactory и Destination.&amp;#160; Создадим файл beans-jms.xml в каталоге test\resources. Определяем ConnectionFactory:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;bean id="jmsFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"&gt;&lt;br /&gt; &amp;lt;property name="queueManager"&gt;&lt;br /&gt;  &amp;lt;value&gt;TEST&amp;lt;/value&gt;&lt;br /&gt; &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;property name="transportType" value="0" /&gt;&lt;br /&gt;&amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;TEST – имя локального менеджера очередей. transportType=0, означает что соединение будет в режиме BINDING (&lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.javadoc.doc/configdoc/resources.jms.mqseries/MQQueueConnectionFactory.html"&gt;подробнее&lt;/a&gt;).&lt;br /&gt;Для возможности работы с удаленным менеджером очередей, расположенным на другом компьютере, нужно указать transportType=1 (режим CLIENT) и указать hostName, channel и port:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;bean id="jmsFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"&gt;&lt;br /&gt; &amp;lt;property name="hostName"&gt;&lt;br /&gt;  &amp;lt;value&gt;127.0.0.1&amp;lt;/value&gt;&lt;br /&gt; &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;property name="queueManager"&gt;&lt;br /&gt;  &amp;lt;value&gt;TEST&amp;lt;/value&gt;&lt;br /&gt; &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;property name="channel"&gt;&lt;br /&gt;  &amp;lt;value&gt;SVRCONN&amp;lt;/value&gt;&lt;br /&gt; &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;property name="port"&gt;&lt;br /&gt;  &amp;lt;value&gt;1415&amp;lt;/value&gt;&lt;br /&gt; &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;property name="transportType" value="1" /&gt;&lt;br /&gt;&amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Определяем настройки для Destination:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;bean id="sendDestination" class="com.ibm.mq.jms.MQQueue"&gt;&lt;br /&gt;  &amp;lt;property name="baseQueueName"&gt;&lt;br /&gt;   &amp;lt;value&gt;QUEUE_IN&amp;lt;/value&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt;&amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;QUEUE_IN – имя очереди на менеджере TEST&amp;#160; в которую бедет производиться отправка.&lt;br /&gt;&lt;br /&gt;Далее нужно настроить jmsTemplate&amp;#160; и jmsSender. jmsTemplate:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt; &amp;lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt;&lt;br /&gt;  &amp;lt;property name="connectionFactory"&gt;&lt;br /&gt;   &amp;lt;bean class="org.springframework.jms.connection.SingleConnectionFactory"&gt;&lt;br /&gt;    &amp;lt;property name="targetConnectionFactory"&gt;&lt;br /&gt;     &amp;lt;ref local="jmsFactory" /&gt;&lt;br /&gt;    &amp;lt;/property&gt;&lt;br /&gt;   &amp;lt;/bean&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt;  &amp;lt;property name="defaultDestination"&gt;&lt;br /&gt;   &amp;lt;ref bean="sendDestination" /&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt;  &amp;lt;property name="receiveTimeout"&gt;&lt;br /&gt;   &amp;lt;value&gt;30000&amp;lt;/value&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;jmsSender:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt; &amp;lt;bean id="jmsSender" class="com.smogg.samples.springmq.JMSSender"&gt;&lt;br /&gt;  &amp;lt;property name="jmsTemplate"&gt;&lt;br /&gt;   &amp;lt;ref bean="jmsTemplate" /&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Настройка для отправки сообщений завершена&lt;br /&gt;&lt;br /&gt;5.&amp;#160; Напишем тест для проверки работоспособности. Напишем класс JMSTest в каталоге test/java пакете com.smogg.samples.springmq:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;package com.smogg.samples.springmq;&lt;br /&gt;import org.junit.Assert;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations = { &amp;quot;/beans-jms.xml&amp;quot; })&lt;br /&gt;public class JMSTest {&lt;br /&gt; JMSSender jsmSender;&lt;br /&gt;&lt;br /&gt; @Autowired&lt;br /&gt; public void setJsmSender(JMSSender jsmSender) {&lt;br /&gt;  this.jsmSender = jsmSender;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void testJMSSend() throws Exception {&lt;br /&gt;  String text = &amp;quot;123456&amp;quot;;&lt;br /&gt;  jsmSender.sendMesage(text.getBytes());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Если все сконфигурировано правильно, то после запуска теста в указанной очереди появится новое сообщение.&lt;br /&gt;Заметки по тесту:&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&amp;#160; - говорит JUnit,&amp;#160; что должен использоваться класс SpringJUnit4ClassRunner для запуска теста.&lt;br /&gt;@ContextConfiguration(locations = { &amp;quot;/beans-jms.xml&amp;quot; })&amp;#160; - устанавливает для SpringJUnit4ClassRunner&amp;#160; какие настройки загружать&lt;br /&gt;@Autowired&amp;#160; - устанавливает, что Spring должен&amp;#160; сам определить объект и установить его значение в класс&lt;br /&gt;&lt;br /&gt;6. &lt;strong&gt;Прием сообщений.&lt;/strong&gt; Для приема сообщний в Spring&amp;#160; используется подход, аналогичный MDB (message driven bean) из спецификации JEE, &lt;a href="http://static.springsource.org/spring/docs/2.0.x/reference/jms.html#jms-asynchronousMessageReception"&gt;Message Driven POJO&lt;/a&gt; (MDP).&lt;br /&gt;Это означает то, что вы должны создать класс реализующий методы javax.jms.MessageListener, т.е. в спецификации jms 1.1 это один метод "public void onMessage(Message message);"&lt;br /&gt;Создадим наш класс для чтения сообщений – MessageListener в папке main/java пакете com.smogg.samples.springmq:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;package com.smogg.samples.springmq;&lt;br /&gt;import javax.jms.BytesMessage;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;import javax.jms.Message;&lt;br /&gt;&lt;br /&gt;public class MessageListener implements javax.jms.MessageListener {&lt;br /&gt; public void onMessage(Message message) {&lt;br /&gt;  if (message instanceof BytesMessage) {&lt;br /&gt;   try {&lt;br /&gt;    byte[] byteMess = new byte[(int) ((BytesMessage) message).getBodyLength()];&lt;br /&gt;    ((BytesMessage) message).readBytes(byteMess );&lt;br /&gt;    String mess = new String(byteMess ); &lt;br /&gt;    System.out.println(&amp;quot;Received message: &amp;quot;+ mess);&lt;br /&gt;    &lt;br /&gt;   } catch (JMSException ex) {&lt;br /&gt;    throw new RuntimeException(ex);&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   throw new IllegalArgumentException(&lt;br /&gt;     &amp;quot;Message must be of type ByteMessage&amp;quot;);&lt;br /&gt;  }&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;7. Настройка MessageListener.&amp;#160; Для того, чтобы&amp;#160; наш класс начал получать сообщений нужно произвести следующие настройки в&amp;#160;&amp;#160; beans-jms.xml – создать бин MessageListener, создать jmsContainer. В jmsContainer вы должны укзать сonnectionFactory, destination и ссылку на наш MessageListener. ConnectionFactory мы будем использовать существующую. Настройки:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;!-- this is the Message Driven POJO (MDP) --&gt;&lt;br /&gt; &amp;lt;bean id="messageListener" class="com.smogg.samples.springmq.MessageListener" /&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- and this is the message listener container --&gt;&lt;br /&gt; &amp;lt;bean id="jmsContainer"&lt;br /&gt;  class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;&lt;br /&gt;  &amp;lt;property name="connectionFactory"&gt;&lt;br /&gt;   &amp;lt;bean class="org.springframework.jms.connection.SingleConnectionFactory"&gt;&lt;br /&gt;    &amp;lt;property name="targetConnectionFactory"&gt;&lt;br /&gt;     &amp;lt;ref local="jmsFactory" /&gt;&lt;br /&gt;    &amp;lt;/property&gt;&lt;br /&gt;   &amp;lt;/bean&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt;  &amp;lt;property name="destination" ref="sourceDestination" /&gt;&lt;br /&gt;  &amp;lt;property name="messageListener" ref="messageListener" /&gt;&lt;br /&gt; &amp;lt;/bean&gt;&lt;br /&gt; &amp;lt;bean id="sourceDestination" class="com.ibm.mq.jms.MQQueue"&gt;&lt;br /&gt;  &amp;lt;property name="baseQueueName"&gt;&lt;br /&gt;   &amp;lt;value&gt;QUEUE_IN&amp;lt;/value&gt;&lt;br /&gt;  &amp;lt;/property&gt;&lt;br /&gt; &amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для чтения сообщений мы указали ту же очередь, что и для отправки, чтобы можно было показать как это работает в 1 тесте.&lt;br /&gt;&lt;br /&gt;8. Модифицируем наш тест для проверки приема сообщений:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;package com.smogg.samples.springmq;&lt;br /&gt; @Test&lt;br /&gt; public void testJMSSend() throws Exception {&lt;br /&gt;  String text = &amp;quot;123456&amp;quot;;&lt;br /&gt;  jsmSender.sendMesage(text.getBytes());&lt;br /&gt;  Thread.sleep(3000);&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;Если все настроено правильно, то после запуска теста в логе вы должны увидеть текст:&lt;br /&gt;Send message... &lt;br /&gt;Received message: 123456&lt;br /&gt;&lt;br /&gt;9. Модифицируем MessageListener и тест для автоматической проверки работы. В MessageListener добавим 2 поля - счетчик и текст последнего сообщения и будем устанавливать их при приеме:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;br /&gt;package com.smogg.samples.springmq;&lt;br /&gt;static String readedMessage;&lt;br /&gt; static int messageCount =0;&lt;br /&gt; &lt;br /&gt; public static String getReadedMessage() {&lt;br /&gt;  return readedMessage;&lt;br /&gt; }&lt;br /&gt; public void onMessage(Message message) {&lt;br /&gt;  if (message instanceof BytesMessage) {&lt;br /&gt;   try {&lt;br /&gt;    byte[] byteMess = new byte[(int) ((BytesMessage) message).getBodyLength()];&lt;br /&gt;    ((BytesMessage) message).readBytes(byteMess );&lt;br /&gt;    String mess = new String(byteMess ); &lt;br /&gt;    //only for testing&lt;br /&gt;    incMessageCount();&lt;br /&gt;    readedMessage = mess;&lt;br /&gt;    System.out.println(&amp;quot;Received message: &amp;quot;+ mess);&lt;br /&gt;    &lt;br /&gt;   } catch (JMSException ex) {&lt;br /&gt;    throw new RuntimeException(ex);&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   throw new IllegalArgumentException(&lt;br /&gt;     &amp;quot;Message must be of type BytesMessage&amp;quot;);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; private static synchronized void incMessageCount() {&lt;br /&gt;  ++messageCount;&lt;br /&gt; }&lt;br /&gt; public static int getMessageCount() {&lt;br /&gt;  return messageCount;&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;Модифицируем тест: &lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;br /&gt; public void testJMSSend() throws Exception {&lt;br /&gt;  String text = &amp;quot;123456&amp;quot;;&lt;br /&gt;  String sendText = &amp;quot;&amp;quot;;&lt;br /&gt;  for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;   sendText = text + i;&lt;br /&gt;   jsmSender.sendMesage(sendText.getBytes());&lt;br /&gt;  }&lt;br /&gt;  Thread.sleep(3000);&lt;br /&gt;  Assert.assertEquals(10, MessageListener.getMessageCount());&lt;br /&gt;  Assert.assertEquals(sendText, MessageListener.getReadedMessage());&lt;br /&gt;&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;Теперь при запуске теста, если сообщения не будут считываться или отправляться, будет ошибка.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Скачать архив с проектом &lt;a href="http://smoggit.net.ru/download/blog/spring-mq.zip"&gt;spring-mq.zip&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Успехов всем.&lt;br /&gt;Ссылки:&lt;br /&gt;&lt;a href="http://static.springsource.org/spring/docs/2.5.x/reference/jms.html"&gt;Дополнительная информация по Spring-jms&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www-01.ibm.com/software/integration/wmq/"&gt;Websphere MQ&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Oracle OC4J 10.1.3.3 и IBM Websphere MQ 6</title><link>http://smoggit.blogspot.com/2009/08/oracle-oc4j-10133-ibm-websphere-mq-6.html</link><category>JEE</category><category>OC4J</category><category>Websphere MQ</category><author>noreply@blogger.com (SmoggIT)</author><pubDate>Sun, 2 Aug 2009 01:25:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-954531369355785380</guid><description>&lt;p&gt;Хотел поделиться опытом настройки OC4J (Oracle Containers for J2EE) для подключения к системе обмена сообщениями Websphere MQ 6. &lt;/p&gt;  &lt;p&gt;Проблема с первого взгляда тривиальна, но существует ряд моментов, на которые можно потратить уйму времени, так как полной документации по настройке нет.&lt;/p&gt;  &lt;p&gt;До выхода WMQ 6, для подключения Oc4J к WMQ, мы использовали несколько модифицированный адаптер oraclejms (поставляется с Oc4j), jndi файлы с настройками очередей. Так же приходилось патчить класслоадер OC4J. В WMQ 6, начиная, кажется, с версии 6.0.2.5 появился JCA 1.5 адаптер для подключения java приложений к WMQ. Вот его я и решил попробовать использовать.&lt;/p&gt;  &lt;p&gt;Итак, задача такая. Нужно научить JEE приложение читать сообщения из очередей WMQ и отправлять в WMQ.&lt;/p&gt; &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt; &lt;p&gt;Последовательность шагов такая:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Подготавливаем архив с адаптером ресурсов WMQ и устанавливаем его в OC4J. &lt;/li&gt;    &lt;li&gt;Настраиваем коннектор в OC4J. &lt;/li&gt;    &lt;li&gt;Настраиваем приложение на данный адаптер ресурсов &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Подготовка адаптера ресурсов к WMQ для OC4J.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1. Файл с адаптером находится в каталоге WMQ\Java\lib\jca\wmq.jmsra.rar. Нужно создать файл oc4j-ra.xml и поместить его внутутрь wmq.jmsra.rar в каталог META-INF&lt;/p&gt;  &lt;p&gt;Файл oc4j-ra.xml:&lt;/p&gt;  &lt;pre class="prettyprint lang-xml"&gt;&lt;p&gt;&amp;lt;oc4j-connector-factories xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt; xsi:noNamespaceSchemaLocation=&amp;quot;http://xmlns.oracle.com/oracleas/schema/oc4j-connector-factories-10_0.xsd&amp;quot; &lt;br /&gt; schema-major-version=&amp;quot;10&amp;quot; &lt;br /&gt; schema-minor-version=&amp;quot;0&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;connector-factory location=&amp;quot;WMQ/QueueConnectionFactory&amp;quot; connector-name=&amp;quot;WMQ&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;CCSID&amp;quot; value=&amp;quot;1208&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;channel&amp;quot; value=&amp;quot;SRV.CONN&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;failIfQuiesce&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;hostName&amp;quot; value=&amp;quot;127.0.0.1&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;port&amp;quot; value=&amp;quot;1414&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;queueManager&amp;quot; value=&amp;quot;TESTQMGR&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;transportType&amp;quot; value=&amp;quot;BINDINGS&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;sslResetCount&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;connectionfactory-interface&amp;gt;javax.jms.QueueConnectionFactory&amp;lt;/connectionfactory-interface&amp;gt; &lt;br /&gt; &amp;lt;/connector-factory&amp;gt; &lt;br /&gt; &amp;lt;connector-factory location=&amp;quot;WMQ/XAQueueConnectionFactory&amp;quot; connector-name=&amp;quot;WMQ&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;CCSID&amp;quot; value=&amp;quot;1208&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;channel&amp;quot; value=&amp;quot;SRV.CONN&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;failIfQuiesce&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;hostName&amp;quot; value=&amp;quot;127.0.0.1&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;port&amp;quot; value=&amp;quot;1414&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;queueManager&amp;quot; value=&amp;quot;TESTQMGR&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;transportType&amp;quot; value=&amp;quot;BINDINGS&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;sslResetCount&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;connectionfactory-interface&amp;gt;javax.jms.QueueConnectionFactory&amp;lt;/connectionfactory-interface&amp;gt; &lt;br /&gt; &amp;lt;/connector-factory&amp;gt; &lt;br /&gt;&amp;lt;/oc4j-connector-factories&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Параметры:&lt;br /&gt;WMQ – имя адаптера ресурсов,&lt;br /&gt;WMQ/QueueConnectionFactory (XAQueueConnectionFactory) – имя фабрики для соединения с WMQ,&lt;br /&gt;TESTQMGR – имя менеджера очередей&lt;br /&gt;&lt;br /&gt;2. Нужно скопировать следующие библиотеки из WMQ\java\lib в OC4J\j2ee\home\applib и перезапустить OC4J:&lt;br /&gt;* com.ibm.mq.jar&lt;br /&gt;* com.ibm.mqjms.jar&lt;br /&gt;* dhbcore.jar&lt;br /&gt;* mqconnector.jar&lt;br /&gt;&lt;br /&gt;3. Через консоль администрирования установить wmq.jmsra.rar.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Настройка коннектора в OC4J.&lt;/strong&gt;&lt;br /&gt;Далее, нужно настроить адаптер, прописав нужные параметеры с файле oc4j-connectors.xml:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;p&gt;&amp;lt;connector name=&amp;quot;WMQ&amp;quot; path=&amp;quot;WMQ.rar&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;security-permission enabled=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;description&amp;gt;Security Permissions for the JMS client&amp;lt;/description&amp;gt; &lt;br /&gt; &amp;lt;security-permission-spec&amp;gt;grant { &lt;br /&gt; permission java.security.AllPermission; &lt;br /&gt; };&amp;lt;/security-permission-spec&amp;gt; &lt;br /&gt; &amp;lt;/security-permission&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;connectionConcurrency&amp;quot; value=&amp;quot;10&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;maxConnections&amp;quot; value=&amp;quot;30&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;logWriterEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;reconnectionRetryCount&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;reconnectionRetryInterval&amp;quot; value=&amp;quot;300000&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;timestampsEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;traceDestination&amp;quot; value=&amp;quot;wmq_jms.log&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;traceEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;traceLevel&amp;quot; value=&amp;quot;10&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;adminobject-config location=&amp;quot;WMQ/MQTest&amp;quot;&amp;gt; &lt;br /&gt; &amp;lt;adminobject-class&amp;gt;com.ibm.mq.connector.outbound.MQQueueProxy&amp;lt;/adminobject-class&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;encoding&amp;quot; value=&amp;quot;NATIVE&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;expiry&amp;quot; value=&amp;quot;UNLIMITED&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;baseQueueName&amp;quot; value=&amp;quot;TESTQ&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;failIfQuiesce&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;targetClient&amp;quot; value=&amp;quot;MQ&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;baseQueueManagerName&amp;quot; value=&amp;quot;TESTQMGR&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;CCSID&amp;quot; value=&amp;quot;1208&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;priority&amp;quot; value=&amp;quot;QDEF&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;persistence&amp;quot; value=&amp;quot;PERS&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;config-property name=&amp;quot;port&amp;quot; value=&amp;quot;1414&amp;quot;/&amp;gt; &lt;br /&gt; &amp;lt;/adminobject-config&amp;gt; &lt;br /&gt;...&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Основные параметры, которые вам нужно будет поменять – это baseQueueManagerName (имя менеджера), baseQueueName (имя очереди), adminobject-config location (имя в JNDI)&lt;/p&gt;&lt;br /&gt;После изменения фала нужно перезапустить OC4J перед установкой JEE приложения.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Настройка приложения&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;Настройка приложения на чтение, сводится к настройке MDB бина, прописыванием правильного activation-config.&lt;br /&gt;Пример настройки:&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;p&gt;@MessageDriven&lt;br /&gt; (name = &amp;quot;GeneralTransportMQBean&amp;quot;,&lt;br /&gt; activationConfig = {&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;destinationType&amp;quot;, propertyValue = &amp;quot;javax.jms.Queue&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;destination&amp;quot;, propertyValue =&amp;quot;TESTQ&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;useJNDI&amp;quot;, propertyValue = &amp;quot;false&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;hostName&amp;quot;, propertyValue = &amp;quot;127.0.0.1&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;port&amp;quot;, propertyValue = &amp;quot;1414&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;channel&amp;quot;, propertyValue = &amp;quot;SRV.CONN&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;queueManager&amp;quot;, propertyValue = &amp;quot;TESTQMGR&amp;quot;),&lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;transportType&amp;quot;, propertyValue = &amp;quot;BINDINGS&amp;quot;)&lt;br /&gt; })&lt;br /&gt; @MessageDrivenDeployment(resourceAdapter = &amp;quot;WMQ&amp;quot;)&lt;p&gt;&lt;/p&gt;public class TestMQBean implements MessageListener{…&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Тут, вроде бы, все ясно, где какой параметр.&lt;br /&gt;Если хочется, чтобы настройки на очередь находились вне приложения и их можно было менять без пересборки, то можно прописать конфиг с использованием JNDI:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;p&gt;@MessageDriven &lt;br /&gt;(name = &amp;quot;TestMQBean&amp;quot;, &lt;br /&gt; activationConfig = { &lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;destinationType&amp;quot;, propertyValue = &amp;quot;javax.jms.Queue&amp;quot;), &lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;destination&amp;quot;, propertyValue = &amp;quot;WMQ/MQTest&amp;quot;), &lt;br /&gt; @ActivationConfigProperty(propertyName = &amp;quot;useJNDI&amp;quot;, propertyValue = &amp;quot;true&amp;quot;) &lt;br /&gt;}) &lt;br /&gt;@MessageDrivenDeployment(resourceAdapter = &amp;quot;WMQ&amp;quot;) &lt;br /&gt;public class TestMQBean implements MessageListener{…&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В принципе, вот и все - приложение готово для установки.&lt;br /&gt;&lt;br /&gt;И еще, чтобы при ошибках обработки сообщения помещались из очереди TESTQ в другую очередь, например, очередь ошибочных сообщений, нужно в натройках MQ для очереди TESTQ указать "Backout threshold" (количество повторов обработки) и "Backout requeue queue" (имя очереди).&lt;br /&gt;ps: При использовании JNDI имеется ряд проблем, которые мешают полноценно использовать конфигурацию в JNDI. Подробно проблему и ее решение я описывал на форуме mqseries.net  - MQ 6.0.2.7 JCA 1.5 and OC4J. Problems and Solutions&lt;br /&gt;&lt;/span&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Castor XML - WTF?</title><link>http://smoggit.blogspot.com/2009/06/castor-xml-wtf.html</link><category>java</category><author>noreply@blogger.com (SmoggIT)</author><pubDate>Fri, 26 Jun 2009 00:56:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-1199036862338454861</guid><description>&lt;a href="http://www.castor.org"&gt;Castor XML&lt;/a&gt; - это библиотека для преобразования XML в Java объекты и обратно. Как ее использовать, может я еще напишу, позже. А в этой заметке хотел рассказать, что я увидел в исходниках, когда пытался отладить свою программу. &lt;br /&gt;Так вот, при преобразовании XML в программе возникала ошибка внутри Castor в методе UnmarshallHandler.startElement, поставил я в нем брекпойнт и давай пошагово выполнять... Прошагал в отладке один экран исходника, второй, тут я не выдержал и давай листать... И что бы вы думали - в одном методе более 900 строк!!! WTF?&lt;br /&gt;ps: После такого, вообще говоря, с опасением смотришь на этот продукт, а стоит ли такое чудо использовать...</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Создание Web-сервиса в Java</title><link>http://smoggit.blogspot.com/2009/05/web-java.html</link><category>java</category><category>web</category><category>Web service</category><category>xfire</category><author>noreply@blogger.com (SmoggIT)</author><pubDate>Sat, 2 May 2009 20:10:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-62304108572816373</guid><description>Рассмотрим пример создания простого WEB-сервиса. Инструментов для создания WEB-сервисов в Java достаточно много, мы же будем использовать &lt;a href="http://xfire.codehaus.org/"&gt;XFire&lt;/a&gt;. XFire - это Java SOAP фреймфорк, быстрый, расширяемый и т.д. Что для нас сейчас важно, так это то, что создать WEB-сервис "с нуля" можно достаточно просто.&lt;br /&gt;&lt;div style="text-align: left;"&gt;Наш WEB-сервис будет совсем простой, а именно, будет иметь один метод без параметров и возвращать строку, например, "Привет - это WEB-сервис"&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Для начала нужно подготовить инфраструктуру проектов, как описано в предыдущей статье -"&lt;a href="http://smoggit.blogspot.com/2009/05/java-maven-web.html"&gt;Создание проектов с помощью maven"&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Определим интерфейс (HelloService) и реализацию (HelloServiceImpl) сервиса в проекте SimpleLogic, разместим их в пакете com.dom.ws&lt;br /&gt;HelloService.java&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;br /&gt;package com.dom.ws;&lt;br /&gt;&lt;br /&gt;public interface HelloService {&lt;br /&gt;public String getHello();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HelloServiceImpl.java&lt;br /&gt;&lt;pre class="prettyprint lang-java"&gt;&lt;br /&gt;package com.dom.ws;&lt;br /&gt;&lt;br /&gt;public class HelloServiceImpl implements HelloService {&lt;br /&gt;&lt;br /&gt;public String getHello() {&lt;br /&gt;return "Привет - это WEB-сервис!";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;В файл &lt;/span&gt;SimpleWEB\pom.xml добавим зависимости XFire&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;dependency&gt;&lt;br /&gt;&amp;lt;groupId&gt;org.codehaus.xfire&amp;lt;/groupId&gt;&lt;br /&gt;&amp;lt;artifactId&gt;xfire-jaxb2&amp;lt;/artifactId&gt;&lt;br /&gt;&amp;lt;version&gt;1.1.1&amp;lt;/version&gt;&lt;br /&gt;&amp;lt;/dependency&gt;&lt;br /&gt;&amp;lt;dependency&gt;&lt;br /&gt;&amp;lt;groupId&gt;org.codehaus.xfire&amp;lt;/groupId&gt;&lt;br /&gt;&amp;lt;artifactId&gt;xfire-spring&amp;lt;/artifactId&gt;&lt;br /&gt;&amp;lt;version&gt;1.1.1&amp;lt;/version&gt;&lt;br /&gt;&amp;lt;/dependency&gt;&lt;br /&gt;&amp;lt;dependency&gt;&lt;br /&gt;&amp;lt;groupId&gt;org.codehaus.xfire&amp;lt;/groupId&gt;&lt;br /&gt;&amp;lt;artifactId&gt;xfire-java5&amp;lt;/artifactId&gt;&lt;br /&gt;&amp;lt;version&gt;1.1.1&amp;lt;/version&gt;&lt;br /&gt;&amp;lt;/dependency&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Настроим XFire на публикацию нашего сервиса в виде WEB-сервиса.&lt;br /&gt;Создаем папку SimpleWEB\src\main\resources\META-INF\xfire и в ней файл services.xml следующего содержания:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&amp;lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;&lt;br /&gt;&amp;lt;service&gt;&lt;br /&gt;&amp;lt;name&gt;HelloService&amp;lt;/name&gt;&lt;br /&gt;&amp;lt;namespace&gt;http://localhost/HelloService&amp;lt;/namespace&gt;&lt;br /&gt;&amp;lt;serviceClass&gt;com.dom.ws.HelloService&amp;lt;/serviceClass&gt;&lt;br /&gt;&amp;lt;implementationClass&gt;com.dom.ws.HelloServiceImpl&amp;lt;/implementationClass&gt;&lt;br /&gt;&amp;lt;/service&gt;&lt;br /&gt;&amp;lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Настроим обработчики Xfire в SimpleWEB\src\main\webapp\WEB-INF\web.xml. Полный текст web.xml&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&amp;lt;!DOCTYPE web-app&lt;br /&gt;PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"&lt;br /&gt;"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;web-app&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&gt;&lt;br /&gt;&amp;lt;servlet-name&gt;XFireServlet&amp;lt;/servlet-name&gt;&lt;br /&gt;&amp;lt;display-name&gt;XFire Servlet&amp;lt;/display-name&gt;&lt;br /&gt;&amp;lt;servlet-class&gt;&lt;br /&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;br /&gt;&amp;lt;/servlet-class&gt;&lt;br /&gt;&amp;lt;/servlet&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&gt;&lt;br /&gt;&amp;lt;servlet-name&gt;XFireServlet&amp;lt;/servlet-name&gt;&lt;br /&gt;&amp;lt;url-pattern&gt;/servlet/XFireServlet/*&amp;lt;/url-pattern&gt;&lt;br /&gt;&amp;lt;/servlet-mapping&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&gt;&lt;br /&gt;&amp;lt;servlet-name&gt;XFireServlet&amp;lt;/servlet-name&gt;&lt;br /&gt;&amp;lt;url-pattern&gt;/services/*&amp;lt;/url-pattern&gt;&lt;br /&gt;&amp;lt;/servlet-mapping&gt;&lt;br /&gt;&amp;lt;/web-app&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Сервис написан, Xfire сконфигурирован. Собираем проект. В каталоге ${work}\parent выполняем комманду:&lt;br /&gt;mvn package&lt;/li&gt;&lt;li&gt;Установим наше приложение в &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt;. Приложение находится здесь - SimpleWEB\target\SimpleWEB.war&lt;/li&gt;&lt;li&gt;Доступ к WEB-сервису можно получить по следующему адресу "http://localhost:8080/SimpleWEB/services/HelloService?WSDL"&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibVBzcBU50JbjRxlQvfGIsVkJGyva3pTfCZZRh81jC0V9q6yBBmBk8gnkzkdFNLgChs7GBEicR2mfjox0nPTKuNUxHbnVORatQMKJuKEe1zfEm7ST83Qo4NbhG62cVnCJmhfvfFF8g-00/s1600-h/HelloServiceWsdl.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 180px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibVBzcBU50JbjRxlQvfGIsVkJGyva3pTfCZZRh81jC0V9q6yBBmBk8gnkzkdFNLgChs7GBEicR2mfjox0nPTKuNUxHbnVORatQMKJuKEe1zfEm7ST83Qo4NbhG62cVnCJmhfvfFF8g-00/s200/HelloServiceWsdl.png" alt="" id="BLOGGER_PHOTO_ID_5331228891821063490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/smoggits/Home/SimpleWS.zip?attredirects=0"&gt;Скачать файл с проектом&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ссылки:&lt;br /&gt;&lt;a href="http://docs.codehaus.org/display/XFIRE/Quick+Start"&gt;XFire - быстрый старт&lt;/a&gt;&lt;br /&gt;&lt;a href="http://xfire.codehaus.org/Maven+Guide"&gt;XFire + Maven&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibVBzcBU50JbjRxlQvfGIsVkJGyva3pTfCZZRh81jC0V9q6yBBmBk8gnkzkdFNLgChs7GBEicR2mfjox0nPTKuNUxHbnVORatQMKJuKEe1zfEm7ST83Qo4NbhG62cVnCJmhfvfFF8g-00/s72-c/HelloServiceWsdl.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Java. Создание и сборка проектов с помощью Maven на примере Web-проекта</title><link>http://smoggit.blogspot.com/2009/05/java-maven-web.html</link><category>java</category><category>maven</category><category>web</category><author>noreply@blogger.com (SmoggIT)</author><pubDate>Sat, 2 May 2009 16:46:00 +0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8929976435103052391.post-5796827991673439002</guid><description>&lt;span style="font-size:85%;"&gt;&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; - средство для управления программным проектом - сборка, тестирование, генерация отчетов и т.д. Имеет большое количество плагинов для разных целей.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Рассмотрим, как с помощью maven можно создать и собрать проект.&lt;br /&gt;В качестве примера возьмем пример Web-приложения имеющего 2 модуля, собственно сам WEB-проект (SimpleWEB) и модуль (SimpleLogic), в котором будет находиться логика.&lt;br /&gt;&lt;br /&gt;Первое, что нам нужно сделать, это настроить maven. &lt;a href="http://maven.apache.org/run-maven/index.html"&gt;Полную инструкцию&lt;/a&gt; можно прочитать на сайте maven. Краткое описание:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://maven.apache.org/download.html"&gt;Скачаваем&lt;/a&gt; дистрибутив с сайта maven. В нашем примере, версия 2.0.9.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Распаковываем на диск, например в c:\tools\apache-maven (в дальнейшем, ${maven.home})&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Прописываем в системную переменную "path" путь к bin каталогу ${maven.home}\bin&lt;/li&gt;&lt;li&gt;Можно поменять путь к репозиторию (хранилищу) библиотек на свой (по-умолчанию будет использоватья каталог ${user.home}/.m2/repository) - в файле ${maven.home}\conf\settings.xml прописать элелемент localRepository в разделе settings, например &amp;lt;localrepository&gt;c:/tools/MavenRepository&amp;lt;/localrepository&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="fullpost"&gt;Создание проектов.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Создаем каталог, например, c:\work\java\Simple\ (в дальнейшем - ${work}).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Запускаем консоль в этом каталоге или делаем в консоле этот каталог текущим.&lt;/li&gt;&lt;li&gt;Создание проекта SimpleWEB&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Создание проекта с помощью maven производится командой&lt;br /&gt;mvn archetype:create -DgroupId=&amp;lt;groupid&gt; -DartifactId=&amp;lt;artifactid&gt; -DarchetypeArtifactId=&amp;lt;archetypeartifactid&gt;,&lt;br /&gt;где groupID - ваш идентификатор группы проектов, он же будет использован для создания пакета по-умолчанию, например, groupID=com.dom.simple,&lt;br /&gt;artifactId - имя проекта , например SimpleWEB,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;archetypeArtifactId - тип проекта, если не задан, то  будет создан jar проект&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Выполняем следующую команду:&lt;br /&gt;mvn archetype:create -DgroupId=com.dom.simple -DartifactId=SimpleWEB -DarchetypeArtifactId=maven-archetype-webapp&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf_Zu3rdfAJ9J5DWEy6nR83poEuJP0YCO2smyEiAt_N_RFzCw1vRRxM0adLQa-iefYtrskE8G3zQP9Cm6EZYFuBHtwoxIsb21Jw3C3gPGbkzYk9VbXpn6vnmTpJZZc_PcMba5a-NR2esE/s1600-h/CreateWebProject2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf_Zu3rdfAJ9J5DWEy6nR83poEuJP0YCO2smyEiAt_N_RFzCw1vRRxM0adLQa-iefYtrskE8G3zQP9Cm6EZYFuBHtwoxIsb21Jw3C3gPGbkzYk9VbXpn6vnmTpJZZc_PcMba5a-NR2esE/s200/CreateWebProject2.png" alt="" id="BLOGGER_PHOTO_ID_5331190635469313234" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Создание проекта SimpleLogic. Выполняем команду:&lt;br /&gt;mvn archetype:create -DgroupId=com.dom.simple -DartifactId=SimpleLogic&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJa1GJ3T1r8oS1NX5I50miaP0KVROuOT4DMd-1HO5F46M72JORk1RuQV70PcSM7Lc3eoSVDS8bjVH92wOvPfWUM44wTufKzinJfSL2f7UHTITWAQH1_xJIaK4kudbUTCPkxmbiNVYesZ0/s1600-h/CreateLogicProject.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJa1GJ3T1r8oS1NX5I50miaP0KVROuOT4DMd-1HO5F46M72JORk1RuQV70PcSM7Lc3eoSVDS8bjVH92wOvPfWUM44wTufKzinJfSL2f7UHTITWAQH1_xJIaK4kudbUTCPkxmbiNVYesZ0/s200/CreateLogicProject.png" alt="" id="BLOGGER_PHOTO_ID_5331190995050574578" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Укажем что проект SimpleWEB зависит от SimpleLogic - в файле {work}\SimpleWEB\pom.xml в разделе "dependencies" прописать новую зависимость:&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;dependency&gt;&lt;br /&gt;  &amp;lt;groupId&gt;com.dom.simple&amp;lt;/groupId&gt;&lt;br /&gt;  &amp;lt;artifactId&gt;SimpleLogic&amp;lt;/artifactId&gt;&lt;br /&gt;  &amp;lt;version&gt;1.0-SNAPSHOT&amp;lt;/version&gt;&lt;br /&gt;&amp;lt;/dependency&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Обычно, при использовании maven, создается еще один проект, который содержит в себе ссылки на все остальные проекты. Назовем его "parent". Выполняем комманду:&lt;br /&gt;mvn archetype:create -DgroupId=com.dom.simple -DartifactId=parent&lt;br /&gt;Далее нужно:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;В ${work}\parent\pom.xml в  "&lt;packaging&gt;jar&lt;/packaging&gt;" заменить  "jar" на  "pom"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Блок "dependencies" можно удалить&lt;/li&gt;&lt;li&gt;Прописать блок "modules" с сылками на другие проекты&lt;br /&gt;&lt;pre class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;modules&gt;&lt;br /&gt;&amp;lt;module&gt;../SimpleLogic&amp;lt;/module&gt;&lt;br /&gt;&amp;lt;module&gt;../SimpleWeb&amp;lt;/module&gt;&lt;br /&gt;&amp;lt;/modules&gt;  &lt;modules&gt;&lt;/modules&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Проверим как собираются наши проекты. В каталоге ${work}\parent выполняем комманду:&lt;br /&gt;mvn package&lt;br /&gt;Если все сделали правильно, то проекты собирутся успешно и в каталоге "${work}\SimpleWEB\target" будет создан файл "SimpleWEB.war" который содержит наш проект SimpleWEB и внутрь war фала также помещен SimpleLogic.jar&lt;/li&gt;&lt;li&gt;Созданный при сборке war файл можно публиковать, например, в &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgeFEIJnpTjZt1dAgwafEv6t8vHiPuu1V5yFZEEpPTBmqPBiHi3diCYRW4mqoTnBpKw3cYGNIX9Gb5BZRVfS_ZSvUHGPxAo_gR0tEXlOKhl-amS0YCR_6_4_gSM2QOL2PN2prCvBIEGKU/s1600-h/CreateWebProjectRunned.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 148px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgeFEIJnpTjZt1dAgwafEv6t8vHiPuu1V5yFZEEpPTBmqPBiHi3diCYRW4mqoTnBpKw3cYGNIX9Gb5BZRVfS_ZSvUHGPxAo_gR0tEXlOKhl-amS0YCR_6_4_gSM2QOL2PN2prCvBIEGKU/s200/CreateWebProjectRunned.png" alt="" id="BLOGGER_PHOTO_ID_5331199400117289810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Все, инфраструктура проектов создана, проекты собираются. Можно писать логику, добавлять странички и с помощью команды "mvn package" собирать web-проект.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://sites.google.com/site/smoggits/Home/Simple.zip?attredirects=0"&gt;Скачать файл с проектами&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf_Zu3rdfAJ9J5DWEy6nR83poEuJP0YCO2smyEiAt_N_RFzCw1vRRxM0adLQa-iefYtrskE8G3zQP9Cm6EZYFuBHtwoxIsb21Jw3C3gPGbkzYk9VbXpn6vnmTpJZZc_PcMba5a-NR2esE/s72-c/CreateWebProject2.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>