zoukankan      html  css  js  c++  java
  • J2EE之wildfly 实践5 ---分布式服务中的JMS服务访问

    实践条件与目标:

      1.  分布式服务中主从服务相关配置

      2.  从服务中主要代码片段展示

      3.  此次使用wildfly10,因为其默认的jms服务是activemq.

      (转载请注明来源:cnblogs coder-fang)

    步骤:

    • 主服务配置中使用standalone-full.xml启动,其自带activemq模块。
    • 使用adduser增加应用程序用户名称为guest,密码为guest,角色为guest,增加应用程序用户ejbuser,密码123。
    • 配置文件中找到activemq模块,并修改配置如下:
              <subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
                  <server name="default">
                      <security-setting name="#">
                          <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/>
                      </security-setting>
                      <address-setting name="#" message-counter-history-day-limit="10" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/>
                      <http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/>
                      <http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http">
                          <param name="batch-delay" value="50"/>
                      </http-connector>
                      <in-vm-connector name="in-vm" server-id="0"/>
                      <http-acceptor name="http-acceptor" http-listener="default"/>
                      <http-acceptor name="http-acceptor-throughput" http-listener="default">
                          <param name="batch-delay" value="50"/>
                          <param name="direct-deliver" value="false"/>
                      </http-acceptor>
                      <in-vm-acceptor name="in-vm" server-id="0"/>
                      <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
                      <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
                      <jms-queue name="ticketqueue" entries="java:jboss/exported/jms/queue/ticketqueue"/>
                      <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
                      <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
                      <pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/>
                  </server>
              </subsystem>
      View Code

      注意:我们这里创建的ticketqueue,必须使用java:jboss/exported/格式的jndi,否则外部机器无法访问

    • 编写ticketqueue的MDB,并部署到主服务器中,主要代码如下:
      @MessageDriven(name = "TicketBooked", activationConfig = {
              @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
              @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:jboss/jms/queue/ticketqueue") })
      public class TicketBookedMsg implements MessageListener {
      
          private final static Logger logger = Logger.getLogger(TicketBookedMsg.class);
      
          /**
           * Default constructor.
           */
          public TicketBookedMsg() {
              // TODO Auto-generated constructor stub
          }
      
          /**
           * @see MessageListener#onMessage(Message)
           */
          public void onMessage(Message message) {
              // TODO Auto-generated method stub
              try {
                  final String text = message.getBody(String.class);
                  logger.info("Received    message    " + text);
              } catch (JMSException ex) {
                  logger.error("onmsg error" + ex.toString());
              }
      
          }
      View Code
    • 从服务器可以使用standalone.xml启动,即默认的启动配置,在此配置文件中修改此处:
          <subsystem xmlns="urn:jboss:domain:naming:2.0">
                  <bindings>
                      <external-context name="java:global/JmsServer" module="org.jboss.as.naming" class="javax.naming.InitialContext" cache="true">
                          <environment>
                              <property name="java.naming.factory.initial" value="org.jboss.naming.remote.client.InitialContextFactory"/>
                              <property name="java.naming.provider.url" value="http-remoting://192.168.50.123:8080"/>
                              <property name="java.naming.security.principal" value="ejbuser"/>
                              <property name="java.naming.security.credentials" value="123"/>
                          </environment>
                      </external-context>
                  </bindings>
                  <remote-naming/>
              </subsystem>

      注:此配置增加了一个外部context上下文环境,即访问远程主机jndi的context.

    • 编写从主机相关服务代码,片段如下:
      Context jmsctx = (InitialContext)context.lookup("java:global/JmsServer");
          Destination    queue = (Queue)jmsctx .lookup("jms/queue/ticketqueue");
          ActiveMQConnectionFactory    cf=(ActiveMQConnectionFactory)jmsctx .lookup("jms/RemoteConnectionFactory");    
              cf.setCallTimeout(3000);
          JMSContext    jmsCtx=cf.createContext("guest", "guest");
      jmsCtx.createProducer().send(queue, "ui started");
    • 将写有此代码的服务部署到从服务器中,并调用。
    • 在主服务器中显示如下:
      09:37:50,032 INFO  [com.sanjian.handmsg.TicketBookedMsg] (Thread-96 (ActiveMQ-client-global-threads-30092228)) Received message ui started
    • 致此,wildfly10中分布式服务的jms通信主要框架已实践完成。
  • 相关阅读:
    flex 连接mysql
    正确配置调试world wind on vs2008
    FLex调用servlet连接数据库
    c# 连接mysql并webservice数据
    ADF连接SOM
    转载加收藏关于OPENGL配置VS2008
    flex不能显示本地发布的地图
    Symbian专区
    asp.net控件开发基础學習
    控制网页大小
  • 原文地址:https://www.cnblogs.com/coder-fang/p/6209947.html
Copyright © 2011-2022 走看看