【问题标题】:Camel Jetty Sessions stop working when deploying to a JAR部署到 JAR 时,Camel Jetty 会话停止工作
【发布时间】:2013-01-29 23:14:30
【问题描述】:

如果我将它部署在 JAR 之外,我有一个可以完美运行的项目。但是,当它部署为 JAR 时,它无法获取会话。以下是工件:

Main.java:

public class Main {
    public static void main(String[] args) throws Exception{
        JndiContext registry=new JndiContext();

        CamelContext context=new DefaultCamelContext(registry);
        context.addRoutes(new RouteBuilder() {      
            @Override
            public void configure() {
                try{
                    from("jetty:http://0.0.0.0:7700?matchOnUriPrefix=true&sessionSupport=true").bean(HtmlProcessor.class);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        });

        context.start();
        Thread.sleep(1000000);
        context.stop();

    }
}

HtmlProcessor.java:

public class HtmlProcessor {
    public String login(Exchange exchange){
        HttpSession session=exchange.getIn(HttpServletRequest.class).getSession();
        Integer count=(Integer)session.getAttribute("count");
        if (count==null) count=0;
        count++;
        session.setAttribute("count", count);

        StringBuilder sb=new StringBuilder();
        sb.append("<html><body><form>");
        sb.append(count);
        sb.append("<BR><input type=text name=username></form></body></html>");
        return sb.toString();
    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>user1</groupId>
  <artifactId>jettysession</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
        <camel.version>2.10.3</camel.version>
  </properties>
  <dependencies>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jetty</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.13</version>
        </dependency>

  </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <id>assemble</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Bundle-ClassPath>.</Bundle-ClassPath>
                            <Main-Class>user1.Main</Main-Class>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

这是异常中有意义的部分:

java.lang.NullPointerException 在 user1.HtmlProcessor.login(HtmlProcessor.java:10) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:341) ...

【问题讨论】:

  • HtmlProcessor.java 的第 10 行代码是做什么的?
  • 这是第 10 行“HttpSession session=exchange.getIn(HttpServletRequest.class).getSession();”。基本上,getIn() 返回 null。我很高兴看到你的名字!我知道您对骆驼有深入的了解,可以提供帮助。
  • 您能否也向其他用户更详细地解释一下该 maven 程序集为您的项目做了什么。是否将所有 JAR 放入一个 uber JAR,以及如何运行该 JAR 等。如果是这样,请特别注意某些文件可能会覆盖其他文件,从而导致 uber JAR 不完整。
  • stackoverflow.com/questions/574594/… 解释了 jar-with-dependencies。是的..它是一个超级 JAR。关于在哪里查找覆盖文件的任何建议?
  • 另外,要运行 jar,只需键入 java -jar jettysession-0.0.1-SNAPSHOT-jar-with-dependencies.jar。然后,打开浏览器访问http://localhost:7700/?username=a。每次加载页面时,您应该会看到一个数字增加 1。

标签: java session jetty apache-camel


【解决方案1】:

在 META-INF/services/org/apache/camel/ 中有一个名为 TypeConverter 的文件,您需要将它与来自所有 JAR 的数据进行合并。当您执行此 uber JAR 时,我很确定 TypeConverter 文件可能只是最后一个文件,因此您会丢失数据。

在 Camel 上查看此常见问题解答:http://camel.apache.org/how-do-i-use-a-big-uber-jar.html

【讨论】:

  • 谢谢。在我的 uber JAR 中,该文件有一堆 cmets 和行 org.apache.camel.core。是不是该多说几句?
  • 这似乎已经解决了。我在issues.apache.org/jira/browse/… 使用了 pom.xml 段。它基本上使用了一个带阴影的 JAR,但也排除了一堆资源。
  • 出于好奇,我在 TypeConverter 文件中遗漏了以下几行:org.apache.camel.component.jetty.JettyConverterorg.apache.camel.component.http.HttpConverterorg.apache.camel.component.http.RequestEntityConverter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多