package test;
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 
import org.apache.activemq.ActiveMQSession; 
import org.apache.activemq.BlobMessage; 
import org.apache.activemq.command.ActiveMQBlobMessage; 
import org.apache.activemq.command.ActiveMQQueue; public class Sending { 
 /** 
  * @param args 
  * @throws IOException 
  */ 
 public static void main(String[] args) throws IOException { 
  // TODO Auto-generated method stub 
  long a1 = System.currentTimeMillis(); 
  
  /* 
   * First you must tell how the Blob repository can be found. 
   * Use ActiveMQ 5.1.0+ as broker because the fileserver webapp works there out of the box. 
   */ 
  ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory( 
    "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8686/fileserver/"); 
  ActiveMQConnection conn = null; 
  ActiveMQSession session = null; 
  try { 
   conn = (ActiveMQConnection)cf.createConnection(); 
   conn.start();
   session = (ActiveMQSession) conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
   Destination destination = new ActiveMQQueue("Queue"); 
   MessageProducer producer = session.createProducer(destination); 
    
   /* 
    * !!!!!!!!!!!!!!!!!!!!!!!!! 
    * very important. If it is set to true (default) the uploader is lost in translation ;) 
    * !!!!!!!!!!!!!!!!!!!!!!!!! 
    */ 
   conn.setCopyMessageOnSend(true); 
    
   File file = File.createTempFile("amq-data-file-", ".dat"); 
   // lets write some data 
   BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
   writer.append("Hello World!"); 
   writer.close(); 
    
   /* 
    * i have used an simple ascii file instead of the picture you want to use 
    */ 
   BlobMessage message = session.createBlobMessage(file); 
    
   /* 
    * should only work if you receive the message 
    */ 
   System.out.println(message.getInputStream()); 
    
   producer.send(message); 
    
   /* 
    * After all you can see a new file under $Brokerlocation$/webapps/fileserver/ 
    */ 
  } catch (JMSException e) { 
   e.printStackTrace(); 
  } finally { 
   try { 
    if (session != null) { 
     session.close(); 
    } 
    if (conn != null) { 
     conn.close(); 
    } 
   } catch (JMSException ex) { 
   } 
  } 
  a1 = System.currentTimeMillis() - a1; 
  System.out.println(a1); 
 } 
}报错:
javax.jms.JMSException: PUT was not successful: 403 Forbidden

解决方案 »

  1.   

    403 Forbidden 对方拒绝!?难道要用户名和密码?
      

  2.   

    第一:
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory( 
        "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8686/fileserver/");这句后面那个端口8686,你看看apache-activemq-$version/conf/activemq.xml中的
    <jetty ...>
            <connectors>
                <nioConnector port="8161"/>
            </connectors>
    </jetty>
    nioConnector 指定的是8686吗? 不是的话你就把你程序里的改为这个端口试试.
    第二:
    上面端口没有问题的话,用
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("system","manager", 
        "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8686/fileserver/");
    试试
      

  3.   

    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("system","manager","tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8686/fileserver/");
      

  4.   

    我把端口改成我机器设置的端口,你的程序在我这里是OK的.
    不知道你的版本是什么,我的是apache-activemq-5.2.0
      

  5.   

    你是不是启动了activemq.bat?如果是,它是可以的,我用tomcat加载配置文件启动的,是错误的!acivemq.XML<!--
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
        this work for additional information regarding copyright ownership.
        The ASF licenses this file to You under the Apache License, Version 2.0
        (the "License"); you may not use this file except in compliance with
        the License.  You may obtain a copy of the License at
       
        http://www.apache.org/licenses/LICENSE-2.0
       
        Unless required by applicable law or agreed to in writing, software
        distributed under the License is distributed on an "AS IS" BASIS,
        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        See the License for the specific language governing permissions and
        limitations under the License.
    -->
            <!-- START SNIPPET: xbean -->
    <beans><bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:resources/param.properties" />
    </bean>  <broker useJmx="true" xmlns="http://activemq.apache.org/schema/core" persistent="true" deleteAllMessagesOnStartup="false" dataDirectory="${base.data}" brokerName="localhost" useShutdownHook="false" >  <persistenceAdapter>   
         <amqPersistenceAdapter directory="${base.data}" maxFileLength="32mb"/>   
      </persistenceAdapter>  
      
      
      
      
      <!-- In ActiveMQ 4, you can setup destination policies -->
        <destinationPolicy>  
          <policyMap>  
            <policyEntries>  
                     <policyEntry queue="EUCITA.>" producerFlowControl="false" memoryLimit="10mb"/>
              <policyEntry topic="EUCITA.>" producerFlowControl="false" memoryLimit="10mb">  
                
            <dispatchPolicy>  
       
                  <strictOrderDispatchPolicy/>  
                </dispatchPolicy>              <subscriptionRecoveryPolicy>  
                          <lastImageSubscriptionRecoveryPolicy/>  
                </subscriptionRecoveryPolicy>  
              </policyEntry>  
            </policyEntries>  
          </policyMap>  
        </destinationPolicy>  
      
        <transportConnectors>
          <transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
          <transportConnector name="stomp" uri="stomp://localhost:61613"/>
          <transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
        </transportConnectors>    <networkConnectors>
          <!-- by default just auto discover the other brokers -->
           <networkConnector name="defaultNetwork" uri="multicast://default"/>
          <!--
          <networkConnector name="host1 and host2" uri="static://(tcp://host1:61616,tcp://host2:61616)" failover="true"/>
          -->
        </networkConnectors>  </broker>  <!-- lets create a command agent to respond to admin commands over JMS or XMPP on the ActiveMQ.Agent topic -->
      <commandAgent xmlns="http://activemq.apache.org/schema/core"/></beans>
            <!-- END SNIPPET: xbean -->