posts - 88, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2015年8月18日

          在Spring cloud config出來(lái)之前, 自己實(shí)現(xiàn)了基于ZK的配置中心, 杜絕了本地properties配置文件, 原理很簡(jiǎn)單, 只是重載了PropertyPlaceholderConfigurer的mergeProperties():

          /**
          * 重載合并屬性實(shí)現(xiàn)
          * 先加載file properties, 然后并入ZK配置中心讀取的properties
          *
          * @return 合并后的屬性集合
          * @throws IOException 異常
          */
          @Override
          protected Properties mergeProperties() throws IOException {
          Properties result = new Properties();
          // 加載父類的配置
          Properties mergeProperties = super.mergeProperties();
          result.putAll(mergeProperties);
          // 加載從zk中讀取到的配置
          Map<String, String> configs = loadZkConfigs();
          result.putAll(configs);
          return result;
          }

          這個(gè)實(shí)現(xiàn)在spring項(xiàng)目里用起來(lái)還是挺順手的, 但是近期部分spring-boot項(xiàng)目里發(fā)現(xiàn)這種placeholder的實(shí)現(xiàn)跟spring boot的@ConfigurationProperties(prefix = "xxx") 不能很好的配合工作,
          也就是屬性沒(méi)有被resolve處理, 用@Value的方式確可以讀到, 但是@Value配置起來(lái)如果屬性多的話還是挺繁瑣的, 還是傾向用@ConfigurationProperties的prefix, 于是看了下spring boot的文檔發(fā)現(xiàn)PropertySource order:
             * Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
             * @TestPropertySource annotations on your tests.
             * @SpringBootTest#properties annotation attribute on your tests.
             * Command line arguments.
             * Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
             * ServletConfig init parameters.
             * ServletContext init parameters.
             * JNDI attributes from java:comp/env.
             * Java System properties (System.getProperties()).
             * OS environment variables.
             * A RandomValuePropertySource that only has properties in random.*.
             * Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)
             * Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
             * Application properties outside of your packaged jar (application.properties and YAML variants).
             * Application properties packaged inside your jar (application.properties and YAML variants).
             * @PropertySource annotations on your @Configuration classes.
             * Default properties (specified using SpringApplication.setDefaultProperties).
          不難發(fā)現(xiàn)其會(huì)檢查Java system propeties里的屬性, 也就是說(shuō), 只要把mergerProperties讀到的屬性寫入Java system props里即可, 看了下源碼, 找到個(gè)切入點(diǎn)

          /**
          * 重載處理屬性實(shí)現(xiàn)
          * 根據(jù)選項(xiàng), 決定是否將合并后的props寫入系統(tǒng)屬性, Spring boot需要
          *
          * @param beanFactoryToProcess
          * @param props 合并后的屬性
          * @throws BeansException
          */
          @Override
          protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
          // 原有邏輯
          super.processProperties(beanFactoryToProcess, props);
          // 寫入到系統(tǒng)屬性
          if (writePropsToSystem) {
          // write all properties to system for spring boot
          Enumeration<?> propertyNames = props.propertyNames();
          while (propertyNames.hasMoreElements()) {
          String propertyName = (String) propertyNames.nextElement();
          String propertyValue = props.getProperty(propertyName);
          System.setProperty(propertyName, propertyValue);
          }
          }
          }
          為避免影響過(guò)大, 設(shè)置了個(gè)開(kāi)關(guān), 是否寫入系統(tǒng)屬性, 如果是spring boot的項(xiàng)目, 就開(kāi)啟, 這樣對(duì)線上非spring boot項(xiàng)目做到影響最小, 然后spring boot的@ConfigurationProperties完美讀到屬性;

          具體代碼見(jiàn): org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor

          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName)
          throws BeansException {
          ConfigurationProperties annotation = AnnotationUtils
          .findAnnotation(bean.getClass(), ConfigurationProperties.class);
          if (annotation != null) {
          postProcessBeforeInitialization(bean, beanName, annotation);
          }
          annotation = this.beans.findFactoryAnnotation(beanName,
          ConfigurationProperties.class);
          if (annotation != null) {
          postProcessBeforeInitialization(bean, beanName, annotation);
          }
          return bean;
          }

          posted @ 2017-12-08 14:13 Milo的海域 閱讀(904) | 評(píng)論 (0)編輯 收藏

          Spring默認(rèn)不允許對(duì)類的變量, 也就是靜態(tài)變量進(jìn)行注入操作, 但是在某些場(chǎng)景比如單元測(cè)試的@AfterClass要訪問(wèn)注入對(duì)象, 而Junit的這個(gè)方法必須是靜態(tài)的, 也就產(chǎn)生了悖論;

          解決思路有兩個(gè):

          • 思路1: 想辦法對(duì)靜態(tài)變量注入, 也就是繞過(guò)Spring只能運(yùn)行非靜態(tài)變量才能注入依賴的壁壘
          • 思路2: 想辦法@AfterClass改造為非靜態(tài)
            • 實(shí)現(xiàn)Junit RunListener, 覆蓋testRunFinished方法, 這里去實(shí)現(xiàn)類似@AfterClass的功能, 這個(gè)方法是非靜態(tài)的
            • 不要用Junit, 改用TestNG, TestNG里的AfterClass是非靜態(tài)的
            • 用Spring的TestExecutionListeners, 實(shí)現(xiàn)個(gè)Listener, 里面也有個(gè)類似非靜態(tài)的AfterClass的實(shí)現(xiàn), 覆蓋實(shí)現(xiàn)就行

          思路2的幾個(gè)方法都可以實(shí)現(xiàn), 但是單元測(cè)試Runner需要用

          @RunWith(Theories.class)

          而且改用TestNG工程浩大, 只能放棄掉這個(gè)思路

          繼續(xù)走思路1, 只能去繞過(guò)Spring的依賴注入的static壁壘了, 具體代碼如下:

          @Autowired
          private Destination dfsOperationQueue;
          private static Destination dfsOperationQueueStatic; // static version
          @Autowired
          private MessageQueueAPI messageQueueAPI;
          private static MessageQueueAPI messageQueueAPIStatic; // static version


          @PostConstruct
          public void init() {
          dfsOperationQueueStatic = this.dfsOperationQueue;
          messageQueueAPIStatic = this.messageQueueAPI;
          }

          @AfterClass
          public static void afterClass() {
          MessageVO messageVO = messageQueueAPIStatic.removeDestination(dfsOperationQueueStatic);
          System.out.println(messageVO);
          }

          其實(shí)就是用了@PostConstruct 來(lái)個(gè)偷梁換柱而已, 多聲明個(gè)靜態(tài)成員指向非靜態(tài)對(duì)象, 兩者其實(shí)是一個(gè)對(duì)象

          posted @ 2017-04-15 10:32 Milo的海域 閱讀(597) | 評(píng)論 (0)編輯 收藏

          知道activemq現(xiàn)在已經(jīng)支持了rest api, 但是官方對(duì)這部分的介紹一筆帶過(guò) (http://activemq.apache.org/rest.html),


          通過(guò)google居然也沒(méi)搜到一些有用的, 比如像刪除一個(gè)destination, 都是問(wèn)的多,然后沒(méi)下文. 于是花了一些心思研究了一下:


          首先通過(guò)rest api獲取當(dāng)前版本所有已支持的協(xié)議

              http://172.30.43.206:8161/api/jolokia/list


          然后根據(jù)json輸出關(guān)于removeTopic, removeQueue的mbean實(shí)現(xiàn)通過(guò)rest api刪除destination的方法, 注意到用GET請(qǐng)求而不是POST,不然會(huì)報(bào)錯(cuò) (官網(wǎng)的例子里用的wget給的靈感, 開(kāi)始用了POST老報(bào)錯(cuò))


          import org.apache.activemq.command.ActiveMQQueue;
          import org.apache.activemq.command.ActiveMQTopic;
          import org.apache.http.auth.AuthScope;
          import org.apache.http.auth.UsernamePasswordCredentials;
          import org.apache.http.impl.client.BasicCredentialsProvider;
          import org.apache.http.impl.client.DefaultHttpClient;
          import org.springframework.http.HttpEntity;
          import org.springframework.http.HttpHeaders;
          import org.springframework.http.HttpMethod;
          import org.springframework.http.MediaType;
          import org.springframework.http.ResponseEntity;
          import org.springframework.http.client.ClientHttpRequestFactory;
          import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
          import org.springframework.web.client.RestTemplate;

          import javax.jms.Destination;
          import javax.jms.JMSException;
          import java.util.Arrays;


          public class MessageQueueAdmin {
              
          private static final RestTemplate restTemplate = getRestTemplate("admin""admin");

              
          private static String brokerHost = "172.30.43.206";
              
          private static String adminConsolePort = "8161";
              
          private static String protocol = "http";

              
          public static void removeDestination(Destination destination) throws JMSException {
                  String destName, destType;
                  
          if (destination instanceof ActiveMQQueue) {
                      destName 
          = ((ActiveMQQueue) destination).getQueueName();
                      destType 
          = "Queue";
                  } 
          else {
                      destName 
          = ((ActiveMQTopic) destination).getTopicName();
                      destType 
          = "Topic";
                  }

                  
          // build urls
                  String url = String.format("%s://%s:%s/api/jolokia/exec/org.apache.activemq:" +
                          
          "brokerName=localhost,type=Broker/remove%s/%s", protocol, brokerHost, adminConsolePort, destType, destName);
                  System.out.println(url);
                  
          // do operation
                  HttpHeaders headers = new HttpHeaders();
                  headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
                  HttpEntity
          <String> entity = new HttpEntity<String>("parameters", headers);
                  ResponseEntity response 
          = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
                  System.out.println(response.getBody());
              }

              
          public static void main(String[] args) throws JMSException {
                  ActiveMQTopic topic 
          = new ActiveMQTopic("test-activemq-topic");
                  removeDestination(topic);
              }


              
          private static RestTemplate getRestTemplate(String user, String password) {
                  DefaultHttpClient httpClient 
          = new DefaultHttpClient();
                  BasicCredentialsProvider credentialsProvider 
          = new BasicCredentialsProvider();
                  credentialsProvider.setCredentials(AuthScope.ANY, 
          new UsernamePasswordCredentials(user, password));
                  httpClient.setCredentialsProvider(credentialsProvider);
                  ClientHttpRequestFactory rf 
          = new HttpComponentsClientHttpRequestFactory(httpClient);

                  
          return new RestTemplate(rf);
              }
          }

          其他的請(qǐng)求,應(yīng)該都是類似jolokia的exec get request的格式:


          https://jolokia.org/reference/html/protocol.html#exec


          <base url>/exec/<mbean name>/<operation name>/<arg1>/<arg2>/.

          posted @ 2016-10-22 17:31 Milo的海域 閱讀(1441) | 評(píng)論 (0)編輯 收藏

          用Spring JMS 的JmsTemplate從消息隊(duì)列消費(fèi)消息時(shí)發(fā)現(xiàn),使用了CLIENT_ACKNOWLEDGE模式,消息返回后總是自動(dòng)被ack,也就是被broker "Dequeued"

              protected Message doReceive(Session session, MessageConsumer consumer) throws JMSException {
                  
          try {
                      
          // Use transaction timeout (if available).
                      long timeout = getReceiveTimeout();
                      JmsResourceHolder resourceHolder 
          =
                              (JmsResourceHolder) TransactionSynchronizationManager.getResource(getConnectionFactory());
                      
          if (resourceHolder != null && resourceHolder.hasTimeout()) {
                          timeout 
          = Math.min(timeout, resourceHolder.getTimeToLiveInMillis());
                      }
                      Message message 
          = doReceive(consumer, timeout);
                      
          if (session.getTransacted()) {
                          
          // Commit necessary - but avoid commit call within a JTA transaction.
                          if (isSessionLocallyTransacted(session)) {
                              
          // Transacted session created by this template -> commit.
                              JmsUtils.commitIfNecessary(session);
                          }
                      }
                      
          else if (isClientAcknowledge(session)) {
                          
          // Manually acknowledge message, if any.
                          if (message != null) {
                              message.acknowledge();
                          }
                      }
                      
          return message;
                  }
                  
          finally {
                      JmsUtils.closeMessageConsumer(consumer);
                  }
              }

          但是使用異步listener 就不會(huì)出現(xiàn)這個(gè)情況,搜了下google,發(fā)現(xiàn)果然存在這個(gè)問(wèn)題

               https://jira.spring.io/browse/SPR-12995
               https://jira.spring.io/browse/SPR-13255
               http://louisling.iteye.com/blog/241073

          同步方式拉取消息,暫時(shí)沒(méi)找到好的封裝,只能暫時(shí)用這?;蛘弑M量用listener, 這個(gè)問(wèn)題暫時(shí)標(biāo)記下,或者誰(shuí)有更好的解決方案可以comment我

          posted @ 2016-10-12 16:32 Milo的海域 閱讀(1542) | 評(píng)論 (0)編輯 收藏

          默認(rèn)的配置有時(shí)候點(diǎn)不亮顯示器,且分辨率很低,通過(guò)tvservice工具不斷調(diào)試,發(fā)現(xiàn)下面的參數(shù)可以完美匹配了
          修改 /boot/config.txt的下列參數(shù)

          disable_overscan=1
          hdmi_force_hotplug
          =1
          hdmi_group
          =1
          hdmi_mode
          =16
          hdmi_drive
          =2
          config_hdmi_boost
          =4
          dtparam
          =audio=on

          posted @ 2016-06-15 09:32 Milo的海域 閱讀(227) | 評(píng)論 (0)編輯 收藏

          http://stackoverflow.com/questions/3294423/spring-classpath-prefix-difference



            

          SIMPLE DEFINITION

          The classpath*:conf/appContext.xml simply means that all appContext.xml files under conf folders in all your jars on the classpath will be picked up and joined into one big application context.

          In contrast
          , classpath:conf/appContext.xml will load only one such file the first one found on your classpath.


          <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="locations">
          <list>
          <value>classpath:*.properties</value>
          <value>classpath*:*.properties</value>
          </list>
          </property>
          </bean>

          posted @ 2016-05-26 14:14 Milo的海域 閱讀(772) | 評(píng)論 (0)編輯 收藏

          1. IDEA_JDK (or IDEA_JDK_64) environment variable
          2. jre/ (or jre64/) directory in IDEA home
          3. registry
          4. JDK_HOME environment variable
          5. JAVA_HOME environment variable

          posted @ 2016-05-16 08:49 Milo的海域 閱讀(170) | 評(píng)論 (0)編輯 收藏

          java里如何修改console的歷史輸出信息呢?如果是當(dāng)前行的修改可以簡(jiǎn)單想到"\r"的方案,但是如果要修改上一行呢? google了下原來(lái)還是有方法的,需要用到ansi的control sequences
          ANSI code

          用java寫了個(gè)簡(jiǎn)單的例子,例子就是把曾經(jīng)的output修改為其他字符串并恢復(fù)之后的打印,代碼里加了sleep,主要方便理解各種控制序列的含義
                  //print some test messages
                  System.out.println("1");
                  Thread.sleep(
          1000);
                  System.out.println(
          "22");
                  Thread.sleep(
          1000);
                  System.out.println(
          "333");
                  Thread.sleep(
          1000);
                  System.out.println(
          "4444");
                  Thread.sleep(
          1000);

                  
          /**
                   * modify "333" to "-"
                   
          */
                  
          // Move up two lines
                  int count = 2;
                  System.out.print(String.format(
          "\033[%dA", count));
                  Thread.sleep(
          1000);
                  
          // Erase current line content
                  System.out.print("\033[2K");
                  Thread.sleep(
          1000);
                  
          // update with new content
                  System.out.print("-");
                  Thread.sleep(
          1000);
                  
          // Move down two lines
                  System.out.print(String.format("\033[%dB", count));
                  Thread.sleep(
          1000);
                  
          // Move cursor to left beginning
                  System.out.print(String.format("\033[D", count));
                  
          // continue print others
                  Thread.sleep(1000);
                  System.out.println(
          "55555");
                  Thread.sleep(
          1000);

          posted @ 2016-04-21 17:06 Milo的海域 閱讀(419) | 評(píng)論 (0)編輯 收藏

          1. zookeeper basic/fast paxsos 的形象表述 https://www.douban.com/note/208430424/
          2. 詳細(xì)介紹 http://blog.csdn.net/xhh198781/article/details/10949697

          posted @ 2016-03-31 14:06 Milo的海域 閱讀(190) | 評(píng)論 (0)編輯 收藏

          server.compression.enabled=true 
          server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
          server.compression.min-response-size=4096
          第一個(gè)參數(shù)打開(kāi)壓縮開(kāi)關(guān),第二個(gè)參數(shù)添加json reponse(尤其是為rest api),第三個(gè)參數(shù)是根據(jù)reponse的大小設(shè)置啟用壓縮的最小值(默認(rèn)是2K,自己根據(jù)實(shí)際情況調(diào)整)

          參考
          http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#how-to-enable-http-response-compression

          posted @ 2016-03-29 11:50 Milo的海域 閱讀(1906) | 評(píng)論 (0)編輯 收藏

          介紹centos7如何安裝3.0以上的新版本mongodb
          https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/

          posted @ 2016-03-23 10:14 Milo的海域 閱讀(191) | 評(píng)論 (0)編輯 收藏

          1. 默認(rèn)的3個(gè)classloader: BootstrapClassloader (Native實(shí)現(xiàn)), ExtClassloader, AppClassloader (Java實(shí)現(xiàn))
          2. 3個(gè)加載器并不是真正的父子繼承關(guān)系,而是邏輯上的,JVM啟動(dòng)先創(chuàng)建ExtClassloader instance,然后構(gòu)造AppClassloader的時(shí)候傳入ExtClassloader實(shí)例作為parent
                  Launcher.ExtClassLoader extcl;
                  
          try {
                      extcl 
          = Launcher.ExtClassLoader.getExtClassLoader();
                  } 
          catch (IOException var10) {
                      
          throw new InternalError("Could not create extension class loader", var10);
                  }

                  
          try {
                      
          this.loader = Launcher.AppClassLoader.getAppClassLoader(extcl);
                  } 
          catch (IOException var9) {
                      
          throw new InternalError("Could not create application class loader", var9);
                  }

          關(guān)于雙親委派原理: 在加載類的時(shí)候,會(huì)看看parent有沒(méi)有設(shè)定,如果設(shè)定了 就調(diào)用parent.loadClass方法,如果沒(méi)設(shè)定(==null)也就是parent應(yīng)該是BootstrapClassloader, 會(huì)調(diào)用native的findBootstrapClass來(lái)加載類,代碼:
                          try {
                              
          if(this.parent != null) {
                                  c 
          = this.parent.loadClass(name, false);
                              } 
          else {
                                  c 
          = this.findBootstrapClassOrNull(name);
                              }
                          } 
          catch (ClassNotFoundException var10) {
                              ;
                          }

          目的是按照一定優(yōu)先級(jí)別裝載系統(tǒng)的lib,系統(tǒng)ext目錄的lib,以及classpath的lib,防止系統(tǒng)的默認(rèn)行為或者類的實(shí)現(xiàn)被修改。

          3. java 類的動(dòng)態(tài)加載
          Java內(nèi)置的ClassLoader總會(huì)在加載一個(gè)Class之前檢查這個(gè)Class是否已經(jīng)被加載過(guò),已經(jīng)被加載過(guò)的Class不會(huì)加載第二次。因此要想重新加載Class,我們需要實(shí)現(xiàn)自己的ClassLoader。
          另外一個(gè)問(wèn)題是,每個(gè)被加載的Class都需要被鏈接(link),這是通過(guò)執(zhí)行ClassLoader.resolve()來(lái)實(shí)現(xiàn)的,這個(gè)方法是 final的,因此無(wú)法重寫。Resove()方法不允許一個(gè)ClassLoader實(shí)例link一個(gè)Class兩次,因此,當(dāng)你需要重新加載一個(gè) Class的時(shí)候,你需要重新New一個(gè)你自己的ClassLoader實(shí)例。

          posted @ 2016-03-16 15:40 Milo的海域 閱讀(318) | 評(píng)論 (0)編輯 收藏


          maven-shade-plugin 用來(lái)打可執(zhí)行jar包, 可以把所有依賴的三方庫(kù)都包括進(jìn)來(lái)
          exec-maven-plugin 可以執(zhí)行外部命令, 在項(xiàng)目中對(duì)python代碼進(jìn)行編譯, 配合maven-assembly-plugin來(lái)生成package
          maven-assembly-plugin 用來(lái)構(gòu)建項(xiàng)目發(fā)行包, 要配合x(chóng)ml配置文件來(lái)組織包的結(jié)構(gòu),基本思路是從build環(huán)境copy到outputDirectory
          license-maven-plugin 用來(lái)生成項(xiàng)目用到的3方庫(kù)的版權(quán)匯總 或者其他的一些用法
          maven-dependency-plugin 用來(lái)生成項(xiàng)目庫(kù)之間的依賴關(guān)系
          appassembler-maven-plugin 可以為項(xiàng)目生成優(yōu)雅的啟動(dòng)腳本 支持linux/win
          rpm-maven-plugin 用來(lái)為項(xiàng)目構(gòu)建rpm安裝包
          maven-compiler-plugin 指定項(xiàng)目的jdk的編譯兼容版本以及encoding類別

          posted @ 2016-01-26 11:41 Milo的海域 閱讀(269) | 評(píng)論 (0)編輯 收藏

          快捷鍵migrating
          定位選中字符串下個(gè)匹配的位置
          eclipse: ctrl + k
          idea: ctrl + F3       

          eclipse: ctrl + q
          idea: ctrl + shift + backspace
          回到上一次編輯的位置

          持續(xù)更新

          posted @ 2015-11-25 16:46 Milo的海域 閱讀(125) | 評(píng)論 (0)編輯 收藏

          發(fā)現(xiàn)一個(gè)不錯(cuò)的介紹shell中冒號(hào)的用法的文章
          http://codingstandards.iteye.com/blog/1160298

          posted @ 2015-11-09 15:11 Milo的海域 閱讀(250) | 評(píng)論 (0)編輯 收藏

          項(xiàng)目用mvn exec:exec指令來(lái)啟動(dòng)server, 工作中需要調(diào)式server初始化的過(guò)程, 很容易想到mvnDebug, 但是發(fā)現(xiàn)設(shè)置的斷點(diǎn)都沒(méi)有hit, 反復(fù)調(diào)式多次都是如此,折騰了1個(gè)多小時(shí), 突然看到stackoverflow 上有人說(shuō)exec:exec是獨(dú)立進(jìn)程模式, mvnDebug的一些debug選項(xiàng)都被append到了父進(jìn)程了. idea設(shè)置斷點(diǎn)就然并卵了.

          知道了問(wèn)題所在解決就容易了, 只要修改pom.xml, 然后直接mvn exec:exec就能正常調(diào)式了
                      <build>
                          <plugins>
                              <plugin>
                                  <groupId>org.codehaus.mojo</groupId>
                                  <artifactId>exec-maven-plugin</artifactId>
                                  <version>${mvnexec.version}</version>
                                  <executions>
                                      <execution>
                                          <goals>
                                              <goal>exec</goal>
                                          </goals>
                                      </execution>
                                  </executions>
                                  <configuration>
                                      <includeProjectDependencies>true</includeProjectDependencies>
                                      <executable>java</executable>
                                      <workingDirectory>${basedir}/config/sim</workingDirectory>
                                      <classpathScope>runtime</classpathScope>
                                      <arguments>
                                          <argument>-agentlib:jdwp
          =transport=dt_socket,server=y,suspend=y,address=4000</argument>
                                          <argument>-classpath</argument>
                                          <classpath/>
                                          <argument>com.ymiao.Main</argument>
                                          <argument>server</argument>
                                          <argument>${basedir}/config/sim/sim.yml</argument>
                                      </arguments>
                                  </configuration>
                              </plugin>
                          </plugins>
                      </build>

          總結(jié)就是exec:exec是要獨(dú)立一個(gè)新進(jìn)程來(lái)執(zhí)行程序的, exec:java就相反, 其實(shí)用mvnDebug + exec:java也是理論可行的

          posted @ 2015-10-21 17:12 Milo的海域 閱讀(836) | 評(píng)論 (0)編輯 收藏

          After Centos 7.1 tobe installed on my t400, my wireless link "Intel 5100 AGN" cannot be managed by NetworkManager, which show in "PCI unknown" state.

          Googled many pages, most of them introduced how to scan wifi links by command line tool "iw", i tried all steps supplied by the pages but was blocked at the last step to get dynamical ipaddress by dhclient command "sudo dhclient wlp3s0 -v". The dhclient always complain "NO DHCPOFFERS received." (I doubted there should be some tricky to play with dhclient but which i am not faimiar with.. sad.. )

          But i think there would be some extending tool for NetworkManager to manager wifi, then i google "NetworkManager wifi", i got "NetwrokManager-wifi plugin" from link https://www.centos.org/forums/viewtopic.php?f=47&t=52810

          After following steps , i finally make wifi work well on centos 7.1

          • yum install NetworkManager-wifi
          • reboot machine (i tried logout and login, not work) 

          Problem is NetworkManager-wifi is not installed by default on centos 7.1, (would it be my mistake when install OS? strange..)

          posted @ 2015-09-17 10:41 Milo的海域 閱讀(398) | 評(píng)論 (1)編輯 收藏

          http://onlywei.github.io/explain-git-with-d3

          posted @ 2015-09-09 15:57 Milo的海域 閱讀(244) | 評(píng)論 (0)編輯 收藏

          項(xiàng)目中要用到MBean,于是快速體驗(yàn)下,體驗(yàn)過(guò)程中發(fā)現(xiàn)2個(gè)問(wèn)題:

          1. 自定義的Mbean的普通method能在jconsole的Mbeans里顯示出來(lái),但是涉及到geters/seters就無(wú)法顯示了
          2. 如果MBean注冊(cè)到下面形式創(chuàng)建的MBeanServer在Jconsole上無(wú)法顯示的
            MBeanServer server = MBeanServerFactory.createMBeanServer();
            但是如果注冊(cè)到下面的形式創(chuàng)建的Server在Jconsole上是可以顯示MBean的
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();       

          stackoverflow上也有人發(fā)現(xiàn)這個(gè)問(wèn)題

              http://stackoverflow.com/questions/7424009/mbeans-registered-to-mbean-server-not-showing-up-in-jconsole

          posted @ 2015-09-08 10:53 Milo的海域 閱讀(520) | 評(píng)論 (0)編輯 收藏

          http://www.ourd3js.com/wordpress/

          posted @ 2015-08-26 11:22 Milo的海域 閱讀(258) | 評(píng)論 (0)編輯 收藏

          Two compile issues i got:

          One issue is:
              uuid_gen_unix.c: In function 'axutil_uuid_gen_v1':uuid_gen_unix.c:62:20: error: variable 'tv' set but not used [-Werror=unused-but-set-variable]     struct timeval tv;                    ^cc1: all warnings being treated as errors    


          Solution is remove "-Werror" in all configure scripts
          find -type f -name configure -exec sed -i '/CFLAGS/s/-Werror//g' {} \;
          Another issue is:
          /usr/bin/ld: test.o: undefined reference to symbol 'axiom_xml_reader_free'
          /usr/local/axis2c/lib/libaxis2_parser.so
          .0: error adding symbols: DSO missing from command line
          collect2: error: ld returned 
          1 exit status
          make
          [4]: *** [test] Error 1
          make
          [4]: Leaving directory `/home/miaoyachun/softwares/test/axis2c-src-1.6.0/neethi/test'

          As suggested in https://code.google.com/p/staff/issues/detail?id=198, the solution is disable neethi/test in following files:
          • neethi/configure, remove all "test/Makefile"
          • neethi/Makefile.am, update "SUBDIRS = src test" with "SUBDIRS = src"
          • neethi/Makefile.in, update "SUBDIRS = src test" with "SUBDIRS = src"

          Finally, you could run "make; sudo make install"" successfully. Last thing should be paid attention to is you may need copy all head files of neethi/include into /usr/local/axis2c/include/axis2-1.6.0/ which needed when you compile customized web service.

          Enjoining it!!

          posted @ 2015-08-21 11:00 Milo的海域 閱讀(533) | 評(píng)論 (0)編輯 收藏

          http://axis.apache.org/axis2/c/core/docs/axis2c_manual.html#client_api 的hello.c client 編譯命令在我的ubuntu 12.04s上總是報(bào)錯(cuò)
          gcc -o hello -I$AXIS2C_HOME/include/axis2-1.6.0/ -L$AXIS2C_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver -ldl -Wl,--rpath -Wl,$AXIS2C_HOME/lib hello.c
          /tmp/ccCYikFh.o: In function `main':
          hello.c:(.text+0x57): undefined reference to `axutil_env_create_all'
          hello.c:(.text+0x68): undefined reference to `axis2_options_create'
          hello.c:(.text+0x93): undefined reference to `axutil_strcmp'
          hello.c:(.text+0xeb): undefined reference to `axis2_endpoint_ref_create'
          hello.c:(.text+0x102): undefined reference to `axis2_options_set_to'
          hello.c:(.text+0x13d): undefined reference to `axis2_svc_client_create'
          hello.c:(.text+0x168): undefined reference to `axutil_error_get_message'
          hello.c:(.text+0x193): undefined reference to `axutil_log_impl_log_error'
          hello.c:(.text+0x1b1): undefined reference to `axis2_svc_client_set_options'
          hello.c:(.text+0x1d6): undefined reference to `axis2_svc_client_send_receive'
          hello.c:(.text+0x21d): undefined reference to `axiom_node_free_tree'
          hello.c:(.text+0x238): undefined reference to `axutil_error_get_message'
          hello.c:(.text+0x266): undefined reference to `axutil_log_impl_log_error'
          hello.c:(.text+0x28d): undefined reference to `axis2_svc_client_free'
          hello.c:(.text+0x2a8): undefined reference to `axutil_env_free'
          /tmp/ccCYikFh.o: In function `build_om_request':
          hello.c:(.text+0x2ed): undefined reference to `axiom_element_create'
          hello.c:(.text+0x307): undefined reference to `axiom_element_set_text'
          /tmp/ccCYikFh.o: In function `process_om_response':
          hello.c:(.text+0x337): undefined reference to `axiom_node_get_first_child'
          hello.c:(.text+0x351): undefined reference to `axiom_node_get_node_type'
          hello.c:(.text+0x367): undefined reference to `axiom_node_get_data_element'
          hello.c:(.text+0x381): undefined reference to `axiom_text_get_value'
          hello.c:(.text+0x396): undefined reference to `axiom_text_get_value'
          collect2: error: ld returned 
          1 exit status
          仔細(xì)檢查了gcc命令,頭文件,庫(kù)文件的路徑都是對(duì)的,最后跟同事討論才發(fā)現(xiàn)hello.c的位置的問(wèn)題。。如果hello.c的位置放到了依賴庫(kù)的右面 就會(huì)報(bào)類似錯(cuò)誤。但是官方的例子應(yīng)該是測(cè)試過(guò)的,怎么會(huì)有這個(gè)問(wèn)題呢? 難道我的ubuntu 12.04的gcc比較嚴(yán)格?

          修正后的gcc命令如下
          gcc -o hello hello.c  -I$AXIS2C_HOME/include/axis2-1.6.0/ -L$AXIS2C_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver -ldl -Wl,--rpath -Wl,$AXIS2C_HOME/lib

          posted @ 2015-08-18 17:59 Milo的海域 閱讀(350) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 渭源县| 施甸县| 随州市| 耿马| 苗栗县| 密云县| 莱西市| 泗洪县| 崇义县| 澜沧| 太康县| 盐津县| 浮山县| 康乐县| 常山县| 榆中县| 交口县| 宣威市| 岳池县| 石景山区| 台安县| 兴国县| 卓资县| 萍乡市| 岑巩县| 杨浦区| 应用必备| 时尚| 静海县| 上蔡县| 彭泽县| 施秉县| 宁明县| 蒲江县| 武宣县| 曲水县| 酒泉市| 元氏县| 麦盖提县| 滨海县| 西城区|